• 归并排序与快速排序模板与图解笔记(转载)


     https://blog.csdn.net/zpznba/article/details/83745205

    C++ 归并排序与快速排序

    归并排序:

    【算法逻辑】
    归并的思路(分治)是把一个大问题a拆解成两个小问题b和c,解决了两个子问题再整合一下,就解决了原问题。用递归的方法,先分解再合并(分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突):

    【代码实现】

    1. #include<iostream>
    2.  
    3. using namespace std;
    4.  
    5. void Merge(int arr[], int l, int q, int r){
    6. int n=r-l+1;//临时数组存合并后的有序序列
    7. int* tmp=new int[n];
    8. int i=0;
    9. int left=l;
    10. int right=q+1;
    11. while(left<=q && right<=r)
    12. tmp[i++] = arr[left]<= arr[right]?arr[left++]:arr[right++];
    13. while(left<=q)
    14. tmp[i++]=arr[left++];
    15. while(right<=r)
    16. tmp[i++]=arr[right++];
    17. for(int j=0;j<n;++j)
    18. arr[l+j]=tmp[j];
    19. delete [] tmp;//删掉堆区的内存
    20. }
    21.  
    22. void MergeSort(int arr[], int l, int r){
    23. if(l==r)
    24. return; //递归基是让数组中的每个数单独成为长度为1的区间
    25. int q = (l + r)/2;
    26. MergeSort(arr, l, q);
    27. MergeSort(arr, q + 1, r);
    28. Merge(arr, l, q, r);
    29.  
    30. }
    31.  
    32. int main(){
    33. int a[8] = {3,1,2,4,5,8,7,6};
    34. MergeSort(a,0,7);
    35. for(int i=0;i<8;++i)
    36. cout<<a[i]<<" ";
    37. }

    关于归并排序的迭代实现可以参考我的另一篇博客:归并排序的迭代实现

     

    快速排序:

    【算法逻辑】

    从数列中挑出一个元素,称为 “基准”(pivot); 
    重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 
    递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    根据分治、递归的处理思想,我们可以用递归排序下标从 p 到 q-1 之间的数据和下标从 q+1 到 r 之间的数据,直到区间缩小为 1,就说明所有的数据都有序了。这里涉及到基准的选择问题,因此必须有函数Partition()来实现“基准”。

    【代码实现】

    1. #include<iostream>
    2.  
    3. using namespace std;
    4.  
    5. int Parition(int a[], int low,int high){
    6. int pivot=a[high];
    7. int i=low;
    8. for(int j=low;j<high;++j)
    9. {
    10. //j指向当前遍历元素,如果大于等于pivot,继续向前
    11. //如果小于当前元素,则和i指向的元素交换
    12. if (a[j]<pivot) {
    13. swap(a[j], a[i]);
    14. i++;
    15. }
    16. }
    17. swap(a[i], a[high]);
    18. return i;
    19.  
    20. }
    21.  
    22. void QuickSort(int a[], int low, int high){
    23. if(low<high)
    24. {
    25. int q=Parition(a,low, high);
    26. QuickSort(a, low, q-1);
    27. QuickSort(a, q+1,high);
    28.  
    29. }
    30.  
    31. }
    32.  
    33. int main(){
    34. int a[8] = {3,1,2,4,5,8,7,6};
    35. QuickSort(a,0,7);
    36. for(int i=0;i<8;++i)
    37. cout<<a[i]<<" ";
    38. }

    声明:本文的图不是用软件做的,是极客时间 数据结构与算法之美 专栏的作者手绘的,在此做了一个引用。

  • 相关阅读:
    17963 完美数
    17086 字典序的全排列
    17082 两个有序数序列中找第k小(优先做)
    11087 统计逆序对(优先做)
    8594 有重复元素的排列问题(优先做)
    11076 浮点数的分数表达(优先做)
    9715 相邻最大矩形面积
    剑指offer----替换空格
    [IIS][ASP.NET]“拒绝访问临时目录”的解决方法
    windows 2003端口80system进程占用的情况
  • 原文地址:https://www.cnblogs.com/Tidoblogs/p/11173215.html
Copyright © 2020-2023  润新知