1 void quickSort(LineList R[], int first, int end) 2 { 3 int i, j; 4 LineList temp; 5 i = first; 6 j = end; 7 temp = R[i]; 8 R[0] = R[i]; 9 10 while (i < j) 11 { 12 while (i < j && R[0].key <= R[i].key) { 13 j--; 14 } 15 if (i < j) { 16 R[i] = R[j]; 17 i++; 18 } 19 20 while (i < j && R[0].key >= R[i].key) { 21 i++; 22 } 23 if (i < j) { 24 R[j] = R[i]; 25 j--; 26 } 27 28 R[i] = R[0]; 29 30 if (first < i - 1) 31 { 32 quickSort(R, first, i - 1); 33 } 34 if (i + 1 < end) { 35 quickSort(R, i + 1, end); 36 } 37 } 38 }
pivot选取3值平均
1 ElementType Median3( ElementType A[], int Left, int Right ) 2 { 3 int Center = (Left+Right) / 2; 4 if ( A[Left] > A[Center] ) 5 Swap( &A[Left], &A[Center] ); 6 if ( A[Left] > A[Right] ) 7 Swap( &A[Left], &A[Right] ); 8 if ( A[Center] > A[Right] ) 9 Swap( &A[Center], &A[Right] ); 10 /* 此时A[Left] <= A[Center] <= A[Right] */ 11 Swap( &A[Center], &A[Right-1] ); /* 将基准Pivot藏到右边*/ 12 /* 只需要考虑A[Left+1] … A[Right-2] */ 13 return A[Right-1]; /* 返回基准Pivot */ 14 } 15 16 void Qsort( ElementType A[], int Left, int Right ) 17 { /* 核心递归函数 */ 18 int Pivot, Cutoff, Low, High; 19 20 Pivot = Median3( A, Left, Right ); /* 选基准 */ 21 Low = Left; High = Right-1; 22 while (1) { /*将序列中比基准小的移到基准左边,大的移到右边*/ 23 while ( A[++Low] < Pivot ) ; 24 while ( A[--High] > Pivot ) ; 25 if ( Low < High ) Swap( &A[Low], &A[High] ); 26 else break; 27 } 28 Swap( &A[Low], &A[Right-1] ); /* 将基准换到正确的位置 */ 29 Qsort( A, Left, Low-1 ); /* 递归解决左边 */ 30 Qsort( A, Low+1, Right ); /* 递归解决右边 */ 31 32 } 33 34 void QuickSort( ElementType A[], int N ) 35 { /* 统一接口 */ 36 Qsort( A, 0, N-1 ); 37 } 38