基本思想
归并排序的主要思想是分治法。主要过程是:
- 将n个元素从中间切开,分成两部分。(左边可能比右边多1个数)
- 将步骤1分成的两部分,再分别进行递归分解。直到所有部分的元素个数都为1。
- 从最底层开始逐步合并两个排好序的数列。
具体的我们以一组无序数列{14,12,15,13,11,16}为例分解说明,如下图所示:
上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。
#include<iostream>
using namespace std;
int main()
{
void merge_sort(int arr[],int x,int y,int arr1[]);
int n;
cin>>n;
int a[n],b[n];//b[n]为辅助数组;
for(int i=0;i<n;i++)
cin>>a[i];
int frist=0,end=n;//定义排列的起始位置和末位位置
merge_sort(a,frist,end,b);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
void merge_sort(int arr[],int x,int y,int arr1[])
{
if(y-x>1){
int m=x+(y-x)/2;//划分为两部分;
int a,b,i;//重新确定 起始位置和末位位置 ;
a=x;
b=m;
i=x;
merge_sort(arr, x, m, arr1);//递归求解
merge_sort( arr, m, y, arr1); //递归求解
for(int k=x;k<y;k++){
if((arr[a]<=arr[b]&&a<m)||b>=y)arr1[i++]=arr[a++];//将左半端的数组复制到辅助数组中
else arr1[i++]=arr[b++];//将右半端的数组复制到辅助数组中
}
for(i=x;i<y;i++)arr[i]=arr1[i];//从辅助数组中复制到原数组
}
}