數據結構--快速排序


快速排序是數據結構非常經典的一個排序算法,它是在1962年hoare開發的,快速排序用的也是分治的思想。下面來分析一個具體的例子吧。

有這樣一個序列,我們用分治法的思想就是要找到一個基准值,進行第一次快速排序之后,這個基准值的左邊都比它小,這個基准值的右邊都比他的值要大,很顯然這個基准值已經將這個序列分成了兩個部分,然后遞歸再在兩邊分別進行同樣的步驟,這個就是快速排序的思想。

                                                                                                                                 a[7]={4,2,6,3,1,7,5};

4 2 6 3 1 7 5

如何進行呢?一般都是以第一個元素為基准值,設置兩個值i,j,i=0,j=n-1然后j從這個序列的最后面找到一個比基准值小的數,然后讓這個數和基准值交換,即a[i]和a[j]交換知道i=j時,也就是基准值的左右兩邊已經相等了,下面來實際的走一下吧。

第一次:

初始化:i=0,j=6,key=4;//key代表基准值

① 從后邊找一個比key小的數交換

i=0,j=4,key=4;即找到了a[4],a[0]和a[4]交換;

1 2 6 3 4 7 5

②然后再從前面開始找一個比key大的數

 i=2,j=4,key=4;a[2]和a[4]交換

1 2 4 3 6 7 5

③從后找一個比key小的數

i=2,j=3,key=4;a[2]和a[3]交換

1 2 3 4 6 7 5

④然后再從前面找一個比key大的值,

i=3;j=3,key;

因為i已經等於j了,所以第一次快速排序已經結束了,再看看我們的key=4,4的左邊都是比它小的,4的右邊都是比它大的。

第二次會被key分成兩部分,左邊和右邊在進行第一次的步驟,一直遞歸下去,直到整個序列有序。

下面把參考代碼貼在下面

#include<iostream>
using namespace std; void qsort(int a[],int low,int high) { if(low>=high)  return ; int i=low; int j=high; int key=a[low]; int temp; while(i<j){ while(i<j&&key<=a[j]){ j--; } temp=a[i]; a[i]=a[j]; a[j]=temp; while(i<j&&key>=a[i]){ i++; } temp=a[i]; a[i]=a[j]; a[j]=temp; } qsort(a,low,i-1); qsort(a,i+1,high); } int main() { int n; cin >> n; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; } qsort(a,0,n-1); for(int i=0;i<n;i++){ cout << a[i] << ' '; } return 0; }

 


免責聲明!

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



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