(含动画演示)搞懂归并排序 一学就会

归并排序

归并排序与快排一样也属于分治算法,但是分治的方法不一样。

总结下来即三步:

  1. 分成子问题
  2. 递归处理子问题
  3. 子问题合并

代码的具体实现:

void merge_sort(int q[],int l,int r){
    
    
    //1.分成子问题
    if(l>=r) return;//递归结束条件。
    
    int mid = l + r >>1;//( >> 1 <=> / 2 )
    //2.递归处理子问题
    merge_sort(q,l,mid),merge_sort(q,mid+1,r);//将左右两堆排好序。
    
    //使用一个额外的等长的数组(tmp数组)来接收;两堆中较小的那个数字。
    // => 达到排序的目的
    //3.子问题合并
    int k = 0,i = l,j = mid + 1;
    while(i<=mid && j<=r)
        if(q[i]<=q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    //如果两堆还剩下数,直接全部装到临时数组后面。(左边那堆先装)=> 确保了归并排序的稳定性
    while(i<=mid) tmp[k++] = q[i++];
    while(j<=r) tmp[k++] = q[j++];
    //排好序的数字归位。
    for(i=l,j=0;i<=r;i++,j++) q[i] = tmp[j];
}

动画演示

请添加图片描述
在这里插入图片描述
在这里插入图片描述## 标题

猜你喜欢

转载自blog.csdn.net/Sherlook_Holmes/article/details/120584469
今日推荐