-
将两个或两个以上的有序子序列归并成一个有序序列
-
在内部排序中,通常采用的是2-路归并排序
-
即:将两个位置相邻的有序子序列R[l...m]和R[m+1...n]归并为一个有序序列R[l...n]
-
上面这棵树称为归并树,需要归并的数目等于树的高度,即roof(log2n)趟
用两个指针分别遍历两个数组,把较小的加入新数组即可,这样就把两个有序的数组归并成一个有序的数组了
//归并排序算法
#include <bits/stdc++.h>
#define MAXSIZE 50//数组最大存储结构
using namespace std;
int arr[MAXSIZE+1];
void MergeSort(int start, int end) {
if (start==end); //若排序区间只有一个元素,则不进行任何操作
else {//排序区间大于一个元素
int tem[end-start+1];//中间数组存储两个数组归并后的数列
int mid=(start+end)/2;//中间位置,将该数组分成左右两数组
MergeSort(start, mid);//对左边归并排序
MergeSort(mid+1, end);//对右边归并排序
//开始将两个排好序的数组归并为一个,并存在临时数组tem中
int i=start, j=mid+1, k=0;
while (i<=mid&&j<=end) {
if (arr[i]<arr[j]) {
tem[k]=arr[i]; i++;
}
else {
tem[k]=arr[j]; j++;
}
k++;
}
while (i>mid&&j<=end) {
tem[k]=arr[j]; j++; k++;
}
while (j>end&&i<=mid) {
tem[k]=arr[i]; i++; k++;
}
//将tem中的部分拷贝到原数组中
for (i=start, j=0; i<=end; i++, j++) arr[i]=tem[j];//拷贝tem中元素到arr
}//tem自动销毁
}
int main() {
int n; cin>>n;//输入数列表长
for (int i=1; i<=n; i++) cin>>arr[i];//输入乱序数列
for (int i=1; i<=n; i++) cout<<arr[i]<<' ';
cout<<endl;//打印乱序数组
MergeSort(1, n);//归并排序
for (int i=1; i<=n; i++) cout<<arr[i]<<' ';
cout<<endl;//打印顺序数组
return 0;
}