它在时间复杂度上由于我们较常用的冒泡或者查找等算法,它实现了在最坏情况下O(nlogn)
C语言实现:
#include<stdio.h>
int num[100];
void merge(int low,int mid,int hi)
{
int temp[100];
int i,j,k;
i=k=low;
j=mid;
while(j<hi||i<mid)
{
if((i<mid)&&(j>=hi||(num[i]<num[j])))
{
temp[k++] = num[i++];
}
if((j<hi)&&(i>=mid||num[j]<num[i]))
{
temp[k++] = num[j++];
}
}
for(i=low;i<hi;i++)
{
num[i] = temp[i];
}
}
void mergesort(int low,int hi)
{
int mid;
if(hi - low < 2)
return;
else
{
mid = (low + hi)>>1;
mergesort(low,mid);
mergesort(mid,hi);
}
merge(low,mid,hi);
}
int main()
{
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
mergesort(0,n);
for(i=0;i<n;i++)
{
printf("%d ",num[i]);
}
}
return 0;
}
归并排序即采用分治策略,将一个排列先连续分割为一个个元素,这是保证了每个排列的有序性,而这个算法的关键在于要将分割好的小排列将其合并为一个有序的大排列,这是最关键的。