最近看完了算法導論的快速排序,今天來梳理梳理快排。希望對想學快速排序的同學能有所幫助。
原理:
快速排序也是分治法思想的一種實現,他的思路是使數組中的每個元素與基准值(Pivot,通常是數組的首個值,A[0])比較,數組中比基准值小的放在基准值的左邊,形成左部;大的放在右邊,形成右部;接下來將左部和右部分別遞歸地執行上面的過程:選基准值,小的放在左邊,大的放在右邊。。。直到排序結束。
步驟:
1.找基准值,設Pivot = a[0]
2.分區(Partition):比基准值小的放左邊,大的放右邊,基准值(Pivot)放左部與右部的之間。
3.進行左部(a[0] - a[pivot-1])的遞歸,以及右部(a[pivot+1] - a[n-1])的遞歸,重復上述步驟。
排序效果:

我的C++實現(原始版本,非隨機化快排):
注釋中英摻雜,還請見諒~
1 void QuikSort(int arr[], int length){ 2 3 QuikSort(arr,0,length-1); 4 5 } 6 7 //low:數組的左邊界值,開始為0 8 //high:數組的右邊界值,開始為length-1 9 void QuikSort(int arr[], int low, int high){ 10 if(low>=high){ //遞歸退出條件:只有一個元素時 11 return; 12 } 13 14 int pivot = arr[low]; 15 int i=low; 16 for(int j=low+1;j<=high;j++){ 17 if(arr[j]<=pivot){ //a[j] is smaller than pivot 18 i++; //a[i] is bigger than pivot 19 if(i!=j){ 20 Swap(arr[i],arr[j]); 21 } 22 } 23 } 24 Swap(arr[low],arr[i]); //Swap pivot to middle position 25 26 //進行分化(partition),遞歸 27 QuikSort(arr,low,i-1); //a[i] is the pivot now 28 QuikSort(arr,i+1,high); 29 } 30 31 32 void Swap(int &a, int &b){ 33 int temp = a; 34 a = b; 35 b = temp; 36 }
自己制作的GIF動畫: 分區(partition)的演示

