1 #include <stdio.h> 2 3 #define CUTOFF 3 4 5 typedef int ElementType; 6 7 void SwapTwoNum(ElementType *Num_1,ElementType *Num_2) 8 { 9 int NumTemp = *Num_1; 10 *Num_1 = *Num_2; 11 *Num_2 = NumTemp; 12 } 13 14 // Return Median of left,center,and right 15 //order these and hide the pivot 16 ElementType Median3(ElementType *Array,int Left,int Right) 17 { 18 int Center = (Left + Right) / 2; 19 20 // C >= L,R >= L,R >= C ---> L <= C <= R 21 if(Array[Left] > Array[Center]) 22 { 23 SwapTwoNum(&Array[Left],&Array[Center]); 24 } 25 if(Array[Left] > Array[Right]) 26 { 27 SwapTwoNum(&Array[Left],&Array[Right]); 28 } 29 if(Array[Center] > Array[Right]) 30 { 31 SwapTwoNum(&Array[Center],&Array[Right]); 32 } 33 34 //Hide pivot 35 SwapTwoNum(&Array[Center],&Array[Right-1]); 36 return Array[Right-1]; 37 } 38 39 void InsertionSort(ElementType *Array,int ArrayLen) 40 { 41 int i,j; 42 ElementType ExtractElem; 43 for(i = 1;i < ArrayLen;i ++) 44 { 45 ExtractElem = Array[i]; 46 for(j = i;j > 0 && ExtractElem < Array[j-1];j --) 47 { 48 Array[j] = Array[j-1]; 49 } 50 //Insert 51 Array[j] = ExtractElem; 52 } 53 } 54 55 void QSort(ElementType *Array,int Left,int Right) 56 { 57 int i,j; 58 ElementType Pivot; 59 60 if(Left + CUTOFF <= Right) 61 { 62 Pivot = Median3(Array,Left,Right); 63 i = Left;j = Right - 1; 64 while(1) 65 { 66 while(Array[++i] < Pivot) 67 ; 68 while(Array[--j] > Pivot) 69 ; 70 if(i < j) 71 { 72 SwapTwoNum(&Array[i],&Array[j]); 73 } 74 else 75 { 76 break; 77 } 78 } 79 80 //restore pivot 81 SwapTwoNum(&Array[i],&Array[Right-1]); 82 83 QSort(Array,Left,i-1); 84 QSort(Array,i+1,Right); 85 } 86 else 87 { 88 InsertionSort(Array+Left,Right-Left+1); 89 } 90 } 91 92 void QuickSort(ElementType *Array,int ArrayLen) 93 { 94 QSort(Array,0,ArrayLen-1); 95 } 96 97 int main() 98 { 99 ElementType TestArray[10] = {718,224,3332,4443,55,31,66,79,90,7}; 100 QuickSort(TestArray,10); 101 int i; 102 for(i = 0;i < 10;i ++) 103 { 104 printf("%d ",TestArray[i]); 105 } 106 printf("\n"); 107 return 0; 108 }