Quick Sort 快速排序的原理及實現


最近看完了算法導論的快速排序,今天來梳理梳理快排。希望對想學快速排序的同學能有所幫助。

 

原理:

快速排序也是分治法思想的一種實現,他的思路是使數組中的每個元素與基准值(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)的演示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM