归并排序
两两归并排序,递归和非递归方法。待排序元素有n个,可以将n个元素分为n/2个归并组,余下的按n/4个为归并组,直到最后完全归并。
算法实现一:递归归并。
void Mergesort(int *num,int length)
{
int *sort = (int*)malloc(length*sizeof(int));
if(sort == NULL)
exit(-1);
Mergesort_recursion(num,0,length-1,sort);
}
void Mergesort_recursion(int *num,int low,int high,int *sort)
{
int m;
int(low == high)
sort[low] = num[low];
else
{
m=(low+high)/2;
Mergesort_recursion(num,low,m,sort);
Mergesort_recursion(num,m+1,high,sort);
Merge(sort,low,m,high,num);
}
}
void Merge(int *sort,int low,int m,int high,int *num)
{
int i,j,k;
for(i=low,j=m+1,k=low;i<=m&&j<=high;k++)
if(sort[i]>sort[j])
num[k]=sort[j++];
else
num[k]=sort[i++];
while(i<=m)
num[k++]=sort[i++];
while(j<=high)
num[k++]=sort[j++];
for(i=0;i<=high;i++)
sort[i]=num[i];
}
算法实现二:非递归实现,难点在于对范围的选择。递归过程需要由自己设计实现,主要思想就是先实现(k初值为1)k*=2个元素合并排序,如果剩余一个就直接写入到已归并的数组;接着实现4个元素合并排序,如果此时不止一个元素剩余但又不满4个,将这些剩下的直接归并。直到k>待排序数据长度为止。
void Mergesort(int *num,int length)
{
int *sort = (int*)malloc(length*sizeof(int));
if(sort == NULL)
exit(-1);
int k=1;
while(k<=length)
{
Mergesort_unrecursion(num,k,length,sort);
k*=2;
}
}
void Mergesort_unrecursion(int *num,int k,int length,int *sort)
{
int i=0;
while(i<length-2*k)
{
Merge(num,i,i+k-1,i+2*k-1,sort);
i=i+2*k;
}
if(i < length-k+1)
Merge(num,i,i+k-1,length-1,sort);
else
sort[length-1]= num[i];
}
void Merge(int *sort,int low,int m,int high,int *num)
{
int i,j,k;
for(i=low,j=m+1,k=low;i<=m&&j<=high;k++)
if(sort[i]>sort[j])
num[k]=sort[j++];
else
num[k]=sort[i++];
while(i<=m)
num[k++]=sort[i++];
while(j<=high)
num[k++]=sort[j++];
for(i=0;i<=high;i++)
sort[i]=num[i];
}