归并排序

22 篇文章 1 订阅

  归并排序的思想是分治法。先进行划分,然后对划分得到的部分分别排序进行递归继续划分,最后达到条件后退出递归,逐层合并。
  一方面在进行划分时,划分的重点的计算为了防止数据的溢出,不要采用m=(x+y)/2而应当采用m=x+(y-x)/2的方式。
  主要需要注意的地方在于合并时的条件,在进行合并时,只要两个部分中有一个部分为空即可进行复制到暂存数组,如果都不为空,则要判断大小看是将左边部分还要右边部分复制到暂存数组。
代码如下:

#include <iostream>
#include <string>
using namespace std;
#define Maxn 100
int temp[Maxn] = { 0 };
int A[Maxn] = { 9, 4, 5, 3, 2, 1, 8, 4, 10, 52, 15, 66 };
void merge_sort(int *T, int x, int y, int *Temp_Arr)
{
    //注意以后对于这种划分的操作都采用左开右闭的形式[x,y),这样方便自己思考,所以这里的条件是y-x>1
    //另外二分的时候采用m = x+(y-x)/2的形式,避免直接x+y时数据溢出
    if (y - x > 1)
    {
        int m = x + (y - x) / 2;

        merge_sort(T, x, m, Temp_Arr);
        merge_sort(T, m, y, Temp_Arr);
        int p = x, q = m, k = x;//这里pq的意义是个易错点,主要是为了后面找A中的值赋给暂存数组用的,不要想错了
        while (p < m || q < y)
        {
            //比较左右两侧的数据谁大谁小,小的入暂存数组
            if (p < m&&T[p] <= T[q] || q >= y)Temp_Arr[k++] = T[p++];
            else Temp_Arr[k++] = T[q++];
        }
        for (int i = x; i < y; i++)
            T[i] = Temp_Arr[i];
    }
}
int main()
{
    merge_sort(A, 0, 8, temp);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值