Quicksort

思路:找基准点,使得基准点左边都比它小或相等,右边比它大。

挖坑法:若设基准点在最左边,则先从右边开始(左边开始的话,无法保证交换的数小于基数2 1 4 9),找到第一个小于基准数的数字,放入左边当前位置,放入时左++;再从左寻找第一个大于基准数的位置,放入右边当前位置,放入时右--;

关键就是,把找到的数放入已经“冗余”的坑中。

复杂度: O (nlogn) ~ O( n^2 )

平均是每次二分logn,再乘上每次比较的n。

最差是已经有序,n*(n-1)相当于冒泡排序。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void quicksort(vector<int>&num,int l,int r){
 4     if(l>=r) return;
 5     int x=num[r],i=l,j=r;
 6     while(i<j){
 7         while(i<j&&num[i]<=x) i++;
 8         if(i<j) num[j--]=num[i];
 9         while(i<j&&num[j]>x) j--;
10         if(i<j) num[i++]=num[j];
11     }
12     num[j]=x;
13     quicksort(num,l,j-1);
14     quicksort(num,j+1,r);
15 }
16 int main(){
17    int b[]={1,66,99,1,2,3,3,3,4,4,5,6,6,99};
18    int len=sizeof(b)/sizeof(b[0]);
19    vector<int>num(b,b+len);
20    quicksort(num,0,len-1);
21    for(int i=0;i<num.size();i++)
22     cout<<num[i]<<" ";  
23    cout<<endl;
24    return 0;
25 }
Quicksort

 

posted @ 2019-06-28 10:49  XXrl  阅读(213)  评论(0编辑  收藏  举报