[Algorithm] 归并排序

  • 归并排序是指将两个有序的数组通过排序的方式排列成一个有序数组
  • 基本思路是通过开辟一个与原数组等大的地址空间,然后将原数组数复制到新地址空间,依次从小到大比较两个数组的值,选取其中的最小值作为当前位置最小值
  • 当一个无序的数组需要进行归并排序时,需要用到分治递归的思想
  • 分治递归:
  1. 将一个问题分解为2个或多个与其类型相同的子问题
  2. 对于一个问题的特例(如何将2个或多个子问题合并成一个问题)给出解决方案
  3. 给出递归终止条件
  4. 递归问题的解决模板:
void function(......)
{
	//1.递归终止条件
	//2.将n个子问题分别递归
	//3.给出将n个(已经解决的)子问题合并为一个问题的解决方案
}
void mergeSort(int *arr, int len)
{
    int *zone = new int[len];//一次性分配地址空间
    mergeSort(arr, zone, 0, len - 1);//递归排序
}

void mergeSort(int *arr, int *zone, int beg, int end)
{
    if (end <= beg)//递归终止条件
        return;

    int mid = beg + (end - beg) / 2;
    mergeSort(arr, zone, beg, mid);//对于子数组进行归并排序
    mergeSort(arr, zone, mid + 1, end);//对于子数组进行归并排序

	//当两个子数组都进行归并排序后,成为两个有序的数组,继续归并排序
    for (int i = beg; i <= end; i++)
        zone[i] = arr[i];
    int i = beg;
    int j = mid + 1;

    for (int index = beg; index <= end; index++)
    {

        if (i > mid)
            arr[index] = zone[j++];
        else if (j > end)
            arr[index] = zone[i++];
        else if (zone[i] <= zone[j])
            arr[index] = zone[i++];
        else
            arr[index] = zone[j++];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值