快速排序優化通過中位數優化
阿新 • • 發佈:2019-01-23
<span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
//交換位置傳入兩個地址 void Swap(int *a, int *b) { int temp; temp = *b; *b = *a; *a = temp; } //求出三個數的中位數並且將pivot(關鍵字放在i-1的位置上) int Median3(int A[],int Left,int Right) //left = 起點 right = 終點 { int Center = (Left + Right) / 2; //找出中間位置用Center儲存 if(A[Left] > A[Center]) //保證左邊比中間小 { Swap(&A[Left],&A[Center]); } if(A[Left] > A[Right]) //保證右邊比中間小 { Swap(&A[Left],&A[Right]); } if(A[Center] > A[Right]) //保證中間比右邊小 { Swap(&A[Center],&A[Right]); } Swap(&A[Center],&A[Right-1]); //將中位數藏到right-1的位置上 return A[Right-1]; } //排序演算法的實現傳入三個引數 Left = 起點 Right = 終點 void Quicksort(int A[],int Left,int Right) { int Pivot = Median3(A,Left,Right); //做子集劃分的時候處理關鍵字 int i = Left; //不用考慮第一個和最後一個在中位數裡已經處理過 int j = Right-1; //子集劃分不斷迴圈 while(1) { while ( A[ ++i ] < Pivot ) { } while ( A[ --j ] > Pivot ) { } if ( i < j ) Swap( &A[i], &A[j] ); else break; } Swap(&A[i],&A[Right-1]); //繼續藏位置 if(Left < i-1) Quicksort(A,Left,i-1); //從中間位置到初始位置 if(i+1 < Right) //注意這裡是三個數已排好了 Quicksort(A,i+1,Right); //兩個遞迴所以兩個判斷條件 } //對快排進行封裝 void Quick_Sort(int A[],int N) { Quicksort(A,0,N-1); } int main() { int a[14] = {10,7,2,5,3,4,9,11,15,12,20,902,50,30}; Quick_Sort(a,14); for(int i=0;i<14;i++) { printf("%d ",a[i]); } getchar(); }