【排序】快速排序

既然寫了歸併排序,那就讓我來寫一些快速排序ios

快速排序spa

雖然它叫快速排序,可是它並無想象裏那麼快,快速排序的最差時間複雜度和冒泡排序是同樣的都是O(N2),它的平均時間複雜度爲O(NlogN)。然而歸併排序的平均時間複雜度爲O(NlogN)。code

下面是一個很是形象的圖解blog

首先,有一組數,上面有哨兵i和哨兵j,兩個哨兵分別從數列的最左端和最右端出發,選擇第一個數爲基準數,哨兵j要找小於6的數,而哨兵i要找大於6的數。(注意:必定要j先找,否則的話會很慘的)排序

這個時候,哨兵i和j都找到了本身要找的數,就把它們找到的數交換遞歸

交換後,兩個哨兵繼續向前走ci

這個時候他們又找到了各自要找的數,就繼續交換io

交換後,繼續進行class

這個時候,咱們發現,哨兵i和j相遇了,這個時候,咱們把基準數和他們相遇的數進行交換stream

這個時候,就會發現,基準數6,已經歸位了

以後,咱們就能夠按照一樣的方法,分別把6左右的數列進行排序,最後就能夠獲得一個有序數列了

上圖是一個總結

OK!代碼以下:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int data[1000];
 5 void qsort(int left, int right){
 6     if (left > right) return;    //結束 
 7     int temp=data[left];        //temp是基準數 
 8     int i=left;
 9     int j=right;
10     while (i != j){
11         while (data[j]>=temp && i<j)    //右區間找比基準數大的數 
12             j--;
13         while (data[i]<=temp && i<j)    //左區間找比基準數小的數 
14             i++;
15         if (i<j) swap(data[i],data[j]);    //一次尋找結束,交換兩個數 
16     }
17     swap(data[left],data[i]);            //基準數歸位 
18     qsort(left,i-1);                    //遞歸 
19     qsort(i+1,right);
20 }
21 int main()
22 {
23     int n;
24     cin>>n;
25     for (int i=1; i<=n; i++)
26         cin>>data[i];
27     qsort(1, n);
28     for (int i=1; i<=n; i++)
29         cout<<data[i]<<" ";
30 }
相關文章
相關標籤/搜索