当前位置:   article > 正文

排序算法--归并排序

排序算法--归并排序

排序步骤分析

归并排序的思想:将两个有序的数组合并成一个有序的数组。

第一步:将数组进行分解,当分解成单个元素为一组的时候,才是组内有序的。

第二步:将两两有序的数组进行合并,将两个有序的数组合并成一个有序数组。重复第二步,直至排序完成。

合并的步骤:先申请两个数组合并后那么大小的空间,然后将两个排好序的数组逐一进行比较,往申请空间里面放。


合并思想练习

给定两个大小分别为m和n的正序数组nums1和nums2,找中位数并返回。

函数声明:int findMidNum(vector<int>& nums1,vector<int>& nums2)

范围确定:m=nums1.size();n=nums2.size(); 

声明新数组vector<int> ans(m+n);

  1. int findMidNum(vector<int>& nums1,vector<int>& nums2){
  2. int m=nums1.size();
  3. int n=nums2.size();
  4. vector<int> ans(m+n);
  5. int idx=0;//结果数组的下标从0开始
  6. int lf=0,rt=0;
  7. //lf(left)左子数组的开始下标,rt(right)右子数组的开始下标
  8. while(lf<m&&rt<n){
  9. if(nums1[lf]<=nums2[rt]) ans[idx++]=nums1[lf++];
  10. else ans[idx++]=nums2[rt++];
  11. }
  12. while(lf<m) ans[idx++]=nums1[lf++];//如果左子数组没有放完剩下的就全放进去
  13. while(rt<n) ans[idx++]=nums2[rt++];//如果右子数组没有放完剩下的就全放进去
  14. //因为本来两个数组就有序
  15. if((m+n)%2==0) return ans[(m+n)/2]+ans[(m+n)/2 + 1];
  16. else return ans[(m+n)/2];
  17. }

代码过程分析

确定传入的参数:

1.待排序的数组

2.排序的左边界在数组中的绝对位置

3.排序的右边界在数组中的绝对位置

void MergeSort(vector<int>& v,int left,int right)

首先是寻找基线条件:当数组元素个数为1时,有序,开始合并,否则分解

if(left==right)return;

没有返回:到达该步,找到中间值,开始分解

int mid=(right-left)/2+left;

MergeSort(v,left,mid);

MergeSort(v,mid+1,right);

分解完了,一 一合并

merg(v,left,mid,right);

合并代码实现

  1. void merg(vector<int>& v, int left, int mid, int right) {
  2. int len = right - left + 1;//确定合并数组总长度
  3. vector<int> tmp(len);//开辟合并数组
  4. int i = left; int j = mid + 1;//两个子数组的开始下标
  5. int index = 0;//合并数组的当前下标
  6. while (i <= mid && j <= right) {//如果两个子数组均有值
  7. if (v[i] <= v[j]) tmp[index++] = v[i++];
  8. else if (v[i] > v[j]) tmp[index++] = v[j++];
  9. }
  10. while (i <= mid) {
  11. tmp[index++] = v[i++];
  12. }//如果第一个子数组有剩余,将剩余的数据全部放入
  13. while (j <= right) {
  14. tmp[index++] = v[j++];
  15. }//如果第二个子数组有剩余,将剩余的数据全部放入
  16. index = left;//原始数组从合并操作的左边界开始被赋值
  17. //这样的话,一个个子区间都是确定有序的
  18. //直到最后一次合并,全部有序
  19. for (int i = 0; i < len; i++) {
  20. v[index++] = tmp[i];
  21. }
  22. }

算法分析

时间复杂度:O(nlogn)

稳定性:稳定


感谢大家!

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

闽ICP备14008679号