既然寫了歸併排序,那就讓我來寫一些快速排序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 }