分治思想之归并排序(Mergesort)

【归并排序】

【题目】

给定一个整数数组nums,请利用归并排序算法将该数组升序排列

示例1:

输入:nums=[6,1,2,7,9,3,4,5,10,8]

输出:[1,2,3,4,5,6,7,8,9,10]

【算法分析】

归并排序的基本思想:采用分治策略(Divide and Conquer)总共分三步:

第一步:分解  将n个元素分成含n/2个元素的子序列;

第二步:解决  用合并排序法对两个子序列递归的排序;

第三步:合并  合并两个已排序的子序列已得到排序结果。

[注意]

1. 分解是将数组内的数字不断划分,直到划分到最小区间

2. 当划分到最小区间之后,开始归并

3. 需要借助额外的数组来存储归并过程中的有序子数组

4. 归并排序适用于总体无序,但是各子项相对有序的数列。各层分治递归可以同时进行

【动画展示】

【C++代码实现】

#include<iostream>
using namespace std;
int n;
int nums[10];
int temp[10];
void MergeSort(int left, int right)
{
    if (left >= right)
        return;
    //分解
    int mid = left + (right - left) / 2;
    MergeSort( left, mid);
    MergeSort(mid + 1, right);
    //归并
    int index = left;
    int left1 = left;
    int right1 = mid;
    int left2 = mid + 1;
    int right2 = right;

    while (left1 <= right1 && left2 <= right2){
        if (nums[left1] < nums[left2]){
            temp[index++] = nums[left1++];
        }
        else{
            temp[index++] = nums[left2++];
        }
    }
    //当循环退出时,说明某一小区间归并完毕,此时要将其后的空间添加到辅助数组
    while (left1 <= right1){
        temp[index++] = nums[left1++];
    }

    while (left2 <= right2){
        temp[index++] = nums[left2++];
    }
    //处理前 [1,3] [2, 4]
    //处理后tmp  [1,2,3,4]
    //拷贝至nums
    //将子区间处理完毕,现在处理原来数组
    for (int i = left; i <= right; ++i){
        nums[i] = temp[i];
    }
}
int main()
{
    cout << "*****归并排序*****" << endl;
    cout << "请输入要排序的数组的大小:";
    cin >> n;
    cout << "请输入数组内容:";
    for (int i = 1; i <= n; i++) cin >> nums[i];
    MergeSort(1, n);
    for (int i = 1; i <= n; i++) cout << nums[i] << " ";
}

运行截图: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值