以前關於快速排序一直比較模糊,網上有幾種常見寫法:c++
方法一:ide
1 void quickSort(int s[], int l, int r) 2 { 3 if (l< r) 4 { 5 int i = l, j = r, x = s[l]; 6 while (i < j) 7 { 8 while(i < j && s[j]>= x) // 從右向左找第一個小於x的數 9 j--; 10 if(i < j) 11 s[i++] = s[j]; 12 while(i < j && s[i]< x) // 從左向右找第一個大於等於x的數 13 i++; 14 if(i < j) 15 s[j--] = s[i]; 16 } 17 s[i] = x; 18 quickSort(s, l, i - 1); // 遞歸調用 19 quickSort(s, i + 1, r); 20 } 21 }
方法二:函數
1 1 void quicksort(point list[],int m,int n) 2 2 { 3 3 int key,i,j,k; 4 4 if( m < n) 5 5 { 6 6 k = choose_pivot(m,n); 7 7 if(m != k) 8 8 swap(list[m],list[k]); 9 9 key = list[m].len; 10 10 i = m+1; 11 11 j = n; 12 12 while(i <= j) 13 13 { 14 14 while((i <= n) && (list[i].len <= key)) i++; 15 15 while((j >= m) && (list[j].len > key)) j--; 16 16 if( i < j) 17 17 swap(list[i],list[j]); 18 18 } 19 19 // 交換兩個元素的位置 20 20 if(m != j) 21 21 swap(list[m],list[j]); 22 22 // 遞歸地對較小的數據序列進行排序 23 23 quicksort(list,m,j-1); 24 24 quicksort(list,j+1,n); 25 25 26 26 } 27 27 28 28 }
下面介紹如題的一種快速排序,大概思想是:(1)選取樞紐值是採用三數中值法 (2)當數據元素個數很小時,採用插入排序ui
1 #define cutoff 5 //定義數值,當待排序的個數小於等於cutoff,採用插入排序 2 3 void QuickSort( int A[], int N )//驅動例程 4 { 5 Qsort( A, 0, N-1 ); 6 } 7 8 /* 9 三數中值法,就是把左端,右端和中心位置的三個元素進行排序,而後將中心位置的主元換到倒數第二個位置。 10 返回主元的值 11 */ 12 int Median3( int A[], int left, int right) 13 { 14 int center; 15 16 center = left + ( right - left ) / 2; //數很大時,避免數據溢出 17 18 if( A[left] > A[center] ) 19 swap(A[left],A[center]);//傳遞的是引用,直接用c++的庫函數便可 20 if( A[left] > A[right] ) 21 swap( A[left], A[right] ); 22 23 if( A[center] > A[right] ) 24 swap( A[center], A[right] ); 25 26 swap( A[center], A[right-1] ); 27 28 return A[right-1]; 29 } 30 31 /* 32 快速排序主例程 33 */ 34 void Qsort( int A[], int left, int right ) 35 { 36 int i,j; 37 int Pivot 38 i = left; 39 j = right - 1; 40 41 if( left + cutoff <= right ) 42 { 43 Pivot = Median3( A[], left, right ); 44 for( ; ; ) 45 { 46 while( A[++i] < Pivot ); 47 48 while( A[--j] > Pivot ); 49 50 if( i< j ) 51 swap( A[i], A[j] ); 52 else 53 break; 54 } 55 swap( A[right-1], A[i] ); 56 57 Qsort( A, left, i-1); 58 Qsort( A, i+1, right); 59 } 60 else 61 { 62 InsertionSort( A+left, right - left + 1 ); 63 } 64 65 }