栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

归并排序解题套路

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

归并排序解题套路

归并排序模板

void merge_sort(int q[], int l, int r)
{
    if (l >= r) return;
 
    int mid = l + r >> 1;//取整个区间的中点
    merge_sort(q, l, mid);//递归排序左边
    merge_sort(q, mid + 1, r);//递归排序右边
    //排完之后,左右两边就都有序了
    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 ++ ];//左右两端,有一边没有循环完的话,就把剩下的数直接接到tmp里
 
    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];//存回
}

思路

1.归并主要的思想也是分治,同样是分治,但是这里的分治与快速排序的分治不一样

1.1快排是拿随机一个数来分,分完之后,保证让左边小于等于分界点,右边大于等于分界点
1.2归并则是以整个数组最中心的位置,分成两段,两端排序完,使用双指针算法

2.双指针算法
3.过程

3.1首先确定数组的中间位置的分界点(下标),也就是mid=(left+right)>>1,分成left,right两段
3.2然后递归排序left,right两端
3.2最后就是将两个有序的数组归并,合二为一,这一部分是归并排序最难的

4.归并排序稳定

稳定指的并不是时间效率上,而是说两个相同的数值,可以保证排完序后位置不变。而快速排序做不
到这点,当然修改后的快排,每个数改成pair,保证没有相同的数值,也能稳定

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/697754.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号