【模板】快速排序 与 归并排序——Template,QuickSort&MergeSort

秒速五厘米 2022-11-12 02:51 357阅读 0赞

快速排序

  1. #include<iostream>
  2. using namespace std;
  3. int n,a[1000001];
  4. void qsort(int l,int r)//应用二分思想
  5. {
  6. int mid=a[(l+r)/2];//中间数
  7. int i=l,j=r;
  8. do{
  9. while(a[i]<mid) i++;//查找左半部分比中间数大的数
  10. while(a[j]>mid) j--;//查找右半部分比中间数小的数
  11. if(i<=j)//如果有一组不满足排序条件(左小右大)的数
  12. {
  13. swap(a[i],a[j]);//交换
  14. i++;
  15. j--;
  16. }
  17. }while(i<=j);//这里注意要有=
  18. if(l<j) qsort(l,j);//递归搜索左半部分
  19. if(i<r) qsort(i,r);//递归搜索右半部分
  20. }
  21. int main()
  22. {
  23. cin>>n;
  24. for(int i=1;i<=n;i++) cin>>a[i];
  25. qsort(1,n);
  26. for(int i=1;i<=n;i++) cout<<a[i]<<" ";
  27. }

归并排序

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 1e6 + 10;
  4. int q[N], tmp[N];
  5. void merge_sort(int q[], int l, int r) {
  6. if(l >= r) { //如果数组中没有数,或者只有一个数,直接return
  7. return ;
  8. }
  9. int mid = (l + r) / 2;
  10. merge_sort(q, l, mid); //递归归并左右两部分
  11. merge_sort(q, mid + 1, r);
  12. int k = 0, i = l, j = mid + 1; //k记录当前tmp数组中已经放好位置的是第几个数
  13. while(i <= mid && j <= r) {
  14. if(q[i] <= q[j]) { //把较小的那个数放入tmp数组中
  15. tmp[k++] = q[i++];
  16. } else {
  17. tmp[k++] = q[j++];
  18. }
  19. }
  20. while(i <= mid) { //如果某个指针走到了尽头,则把另一个数组剩下的部分全部加入到tmp数组中
  21. tmp[k++] = q[i++];
  22. }
  23. while(j <= r) {
  24. tmp[k++] = q[j++];
  25. }
  26. for(int i = l, j = 0; i <= r; ++i, ++j) { //再把tmp数组的数写回到q[l~r]
  27. q[i] = tmp[j];
  28. }
  29. }
  30. int main() {
  31. int n;
  32. scanf("%d", &n);
  33. for(int i = 0; i < n; ++i) {
  34. scanf("%d", &q[i]);
  35. }
  36. merge_sort(q, 0, n - 1);
  37. for(int i = 0; i < n; ++i) {
  38. printf("%d ", q[i]);
  39. }
  40. return 0;
  41. }

测试板子题目:洛谷P1177 【模板】快速排序

归并排序是稳定的算法,快速排序是不稳定的算法。

归并排序的时间复杂度永远都是O(NlogN),
但快速排序的时间复杂度在最坏的情况下为O(n2)

综合考虑,使用归并排序更好,更实用!

发表评论

表情:
评论列表 (有 0 条评论,357人围观)

还没有评论,来说两句吧...

相关阅读

    相关 归并排序模板

    1.随机取其中的一个值,将其分为两边,最后两边分别进行递归排序 2.归并,把两个有序的序列合并成一个有序的序列 ![在这里插入图片描述][watermark_type_d3