先将前半部分排序,再将后半部分排序,最后将两部分合并
递归实现,直到一部分只有一个元素
时间复杂度O(nlogn)
代码
#include<iostream>
using namespace std;
int temp[100];
void merge(int *a,int left,int mid,int right)
{
for(int i=left;i<=right;i++)
temp[i]=a[i]; //先将a整体赋给temp
int l=left,r=mid+1;
int q=left;
while(l<=mid&&r<=right)
{
if(temp[l]>temp[r]) //大的先排
a[q++]=temp[r++];
else
a[q++]=temp[l++];
}
while(l<=mid) //如果最后剩的是前半部分,需要移到后面
{ //如果剩的是后半部分,不需要管,因为本来就是在后面
a[q++]=temp[l++];
}
}
void MergeSort(int *a,int left,int right)
{
int mid;
if(left>=right)
return;
mid=left+(right-left)/2;
MergeSort(a,left,mid); //排前半部分
MergeSort(a,mid+1,right); //排后半部分
merge(a,left,mid,right); //合并
}
int main()
{
int a[]={2,3,1,5,9,2,4,6,7,5,3,8,7,5,3,12};
int n=sizeof(a)/4;
MergeSort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}