时间复杂度:O(nlogn).
空间复杂度:O(n).
基本思路:
将数组分成2组A,B,如果这2组组内的数据都是有序的,那么就可以很方便的将这2组数据进行排序。如何让这2组组内数据有序?
可以将A,B组各自再分成2组。依次类推,当分出来的小组只有1个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的2个小组。这样通过先递归的分解数列,再合并数列就完成了归并排序。
#include <iostream>
using namespace std;
void print(int a[], int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void Merge(int a[], int first, int mid, int last)
{//将2个有序数列a[first...mid]和a[mid...last]合并。
int *tmp=new int[last-first+1];//临时合并序列
int m=mid, n=last;//m,n分别为第1段序列、第2段序列的结尾
//i,j,k分别为第1段序列、第2段序列,以及临时合并序列的下标
int i=first, j=mid+1, k=0;//i,j,k分别为第1段序列、第2段序列,以及临时合并序列的下标
//(1)实现将两个有序序列合并
while(i<=m && j<=n)
{
if(a[i]<=a[j]) tmp[k++]=a[i++];
else tmp[k++]=a[j++];
}
while(i<=m)
{
tmp[k++]=a[i++];
}
while(j<=n)
{
tmp[k++]=a[j++];
}
//(2)将合并序列复制到原始序列中
for(i=0;i<k;i++)
{
a[first+i]=tmp[i];
}
delete[] tmp;
}
//归并排序
void MergeSort(int a[], int first, int last)
{
if(first<last)
{
int mid=first+(last-first)/2;
MergeSort(a, first, mid);//左边有序
MergeSort(a, mid+1, last);//右边有序
Merge(a, first, mid, last);//将二个有序数列合并
}
}
int main()
{
int a1[]={6,2,8,3,5,5,20,32,1};
//int a2[]={2,8,5,5,6,20,32,1,77,19,2};
//int a3[]={17,5,8,3,88,5,20,32,3};
int n1=sizeof(a1)/sizeof(a1[0]);
//int n2=sizeof(a2)/sizeof(a2[0]);
//int n3=sizeof(a3)/sizeof(a3[0]);
MergeSort(a1, 0, n1-1);
print(a1, n1);
return 0;
}
结果:
1 2 3 5 5 6 8 20 32
Process returned 0 (0x0) execution time : 0.607 s
Press any key to continue.