【归并排序】
【题目】
给定一个整数数组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] << " ";
}
运行截图: