当前位置:   article > 正文

算法学习笔记(5.0)-基于比较的高效排序算法-归并排序

算法学习笔记(5.0)-基于比较的高效排序算法-归并排序

##时间复杂度O(nlogn)

目录

##时间复杂度O(nlogn)

##递归实现归并排序

##原理

##图例

##代码实现

##非递归实现归并排序

##释

#代码实现


##递归实现归并排序

##原理

是一种基于分治策略的基础排序算法。

1.划分阶段:通过不断递归地将数组从中点处分开,将长数组的排序问题转化成段数组的排序问题。

2.合并阶段:当子数组的长度为1时终止划分,开始合并,持续不断地将左右两个较短的有序数组合并为一个较长的有序数组,直到结束。

##图例

##代码实现

1.向下递归,对半分割

2.递归返回条件:递归到最小,1个就是有序【控制的是范围,归并的是区间】

3.递归到最深处,最小时,就递归回去,开始分割按对半分割出的范围,将已有子序列合并,在tmp里面进行合并

4.再将tmp里形成的有序序列,拷贝回原数组【因下一次递归回去上一层的归并过程中,会将数据在tmp中进行归并,会将tmp中的数据覆盖,因此要及时,拷】

  1. //python代码示例
  2. def Merge(a, start, mid, end) :
  3. tmp = [] #创建一个临时列表,用来存储合并的值
  4. #两段起点的开始
  5. l = start
  6. r = mid + 1
  7. #当两段都没到达末尾,则继续循环,将其添加到tmp
  8. while l <= mid and r <= end :
  9. if a[l] <= a[r] :
  10. tmp.append(a[l])
  11. l += 1
  12. else :
  13. tmp.append(a[r])
  14. r += 1
  15. #此时肯定只剩下,单一的一个值,即将剩余元素塞入到tmp中
  16. tmp.extend(a[l:mid+1])
  17. tmp.extend(a[r:end+1])
  18. #将合并完成的元素,赋值到a原数组中
  19. for i in range(start,end+1):
  20. a[i] = tmp[i - start]
  21. print(start,end,tmp)
  22. def MergeSort(a,start,end) :
  23. #利用递归来实现归并排序,将大的问题分解成小的子问题
  24. if start == end : #当递归到数组只有一个元素时,直接返回
  25. return
  26. mid = (start + end) // 2 #计算出mid,找到递归点
  27. MergeSort(a,start,mid) #左递归
  28. MergeSort(a,mid+1,end) #右递归
  29. Merge(a,start,mid,end)
  30. #左递归,左合并,右递归,右合并,类似于树的后序遍历
  31. a = [7,3,2,6]
  32. MergeSort(a,0,3)

  1. //c++代码实现示例
  2. #include<iostream>
  3. #include<vector>
  4. using namespace std;
  5. //c++代码实现示例
  6. void merge(vector<int> &a, int left, int mid, int right)
  7. {
  8. int i = left ;
  9. int j = mid + 1 ;
  10. int k = left ;
  11. vector<int> tmp(right - mid + 1) ;
  12. while ( i <= mid && j <= right )
  13. {
  14. if ( a[i] <= a[j] )
  15. {
  16. tmp[k++] = a[i++] ;
  17. }
  18. else
  19. {
  20. tmp[k++] = a[j++] ;
  21. }
  22. }
  23. while ( i <= mid )
  24. {
  25. tmp[k++] = a[i++] ;
  26. }
  27. while ( j <= right )
  28. {
  29. tmp[k++] = a[j++] ;
  30. }
  31. for (int m = left ; m <= right ; m++)
  32. {
  33. a[m] = tmp[m - left] ;
  34. }
  35. cout << left << right << " " ;
  36. for (int n = 0 ; n < tmp.size() ; ++n)
  37. {
  38. cout << tmp[n] << " " ;
  39. }
  40. }
  41. void mergeSort(vector<int> &a, int left, int right)
  42. {
  43. if (left >= right)
  44. {
  45. return ;
  46. }
  47. int mid = (left + right) / 2 ;
  48. mergeSort(a,left,mid) ;
  49. mergeSort(a,mid+1,right) ;
  50. merge(a,left,mid,right) ;
  51. }
  52. int main()
  53. {
  54. // vector<int> arr = {1,2,3,4,5};
  55. //
  56. vector<int> arr;
  57. arr.push_back(7);
  58. arr.push_back(3);
  59. arr.push_back(2);
  60. arr.push_back(6);
  61. // arr.push_back(5);
  62. mergeSort(arr,0,3) ;
  63. return 0 ;
  64. }
  1. void _MergerSort(DataType* a ,DataType* tmp, int begin,int end)
  2. {
  3. //递归返回条件,不正常的范围,或只剩下一个数
  4. if (begin >= end)
  5. {
  6. return ;
  7. }
  8. int mid = (begin + end) / 2 ;
  9. //递归过程
  10. _MergeSort(a,tmp,begin,mid) ;
  11. _MergeSort(a,tmp,mid+1,end) ;
  12. //合并过程
  13. //归并到tmp数组中,再拷贝回去
  14. int begin1 = begin ;
  15. int end1 = mid ;
  16. int begin2 = mid + 1 ;
  17. int end2 = end ;
  18. //指向tmp,=begin是 根据要进行比较插入的数组的位置 找到其对应在tmp中所对应的位置,则不会覆盖前面已经排好序的数据
  19. int index = begin ;
  20. while (begin1 <= end1 && begin2 <= end2)
  21. {
  22. if (a[begin1] < a[begin2])
  23. {
  24. tmp[index++] = a[begin++] ;
  25. }
  26. else
  27. {
  28. tmp[index++] = a[begin2++] ;
  29. }
  30. }
  31. //剩下还没有插入进去的
  32. while (begin1 <= end1)
  33. {
  34. tmp[index++] = a[begin1++];
  35. }
  36. while (begin2 <= end2)
  37. {
  38. tmp[index++] = a[begin2++] ;
  39. }
  40. //拷贝回去原数组a中
  41. memcpy(a+begin,tmp+begin,sizeof(DataType)*(end-begin+1)) ;
  42. }
  43. void MergeSort(DataType* a, int n)
  44. {
  45. DataType* tmp = (DataType*)malloc(sizeof(DataType)*n) ;
  46. if (tmp == NULL)
  47. {
  48. perror("malloc fail") ;
  49. return ;
  50. }
  51. _MergeSort(a,tmp,0,n-1) ;
  52. free(tmp) ;
  53. }

对于链表,归并排序相较于其他排序算法具有显著优势,可以将链表排序任务的空间复杂度优化至 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/608403
推荐阅读
相关标签