• 归并排序算法


    一、归并排序算法

    1.1 编写归并排序,记住下面的内容,代码也就游刃有余了!

    (1) 首先确定数组的中间位置的分界点(下标),也就是mid=(left+right)>>1,分成left,right两段。

    (2) 然后递归排序left,right两端。

    (3) 最后就是将两个有序的数组归并,合二为一,这一部分是归并排序最难的。

    二、归并排序算法的核心

    2.1 主要的思想也是分治

    同样是分治,但是这里的分治与快速排序的分治不一样。

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

    2.2 双指针算法

    2.3 归并排序稳定

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

    三、归并排序算法的代码模板

    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];//存回
    }
    

    查看更多

  • 相关阅读:
    C语言-第四周作业
    第8次Scrum会议(10/20)【欢迎来怼】
    例行报告(20171011-20171019)
    C语言--第二周作业评分和总结(5班)
    C语言-第三周作业
    第一次Scrum会议(10/13)【欢迎来怼】
    单元测试之四则运算
    四则运算V1.1
    例行报告(20170927-20171010)
    C语言--第一周作业评分和总结(5班)
  • 原文地址:https://www.cnblogs.com/lastk/p/12296897.html
Copyright © 2020-2023  润新知