思路:找基准点,使得基准点左边都比它小或相等,右边比它大。
挖坑法:若设基准点在最左边,则先从右边开始(左边开始的话,无法保证交换的数小于基数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 }