title: Notes-QuickSorttags: ACM
abbrlink: 12aa90f7
date: 2020-10-10 12:03:02

思路

快排基本思路应该就是二分+递归,从两侧同时(实则先从右往左)往中间找,同时和参变量对比,发现位置颠倒后交换位置,然后通过二分将其一块一块的分割开,直到分割到一个元素位置,即完成了快排。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[101],n;
  4. void quicksort(int left,int right)
  5. {
  6. int i,j,t,temp;//temp存基准数
  7. if(left>right) return;
  8. temp=a[left];
  9. i=left;
  10. j=right;
  11. while(i!=j)
  12. {
  13. while(a[j]>=temp && i<j) j--;
  14. while(a[i]<=temp && i<j) i++;
  15. if(i<j)
  16. {
  17. t=a[i];
  18. a[i]=a[j];
  19. a[j]=t;
  20. }
  21. }
  22. a[left]=a[i];
  23. a[i]=temp;
  24. quicksort(left, i-1);
  25. quicksort(i+1,right);
  26. return;
  27. }
  28. int main(){
  29. cin>>n;
  30. for(int i=1;i<=n;i++)
  31. cin>>a[i];
  32. quicksort(1,n);
  33. for(int i=1;i<=n;i++)
  34. {
  35. cout<<a[i]<<" ";
  36. }
  37. return 0;
  38. }

总结

快排应该是最常用的模板了,时间复杂度也比较理想

PS.致敬一波快排的提出者东尼·霍尔(C. A. R. Hoare)