分治法排序之归并排序
使用分治法的两路合并排序算法:
将待排序的元素序列一分为二,得到长度基本相等的两个子序列,分别排序。
如果子序列较长,还可继续细分,直到子序列的长度不超过1为止。
当分解所得的子序列已排列有序时,将两个有序子序列合并成一个有序子序列,得到原问题的解。
合并方法:
比较两序列中的最小值,输出其中较小者,然后重复此过程,直到其中一个队列为空时,
如果另一个队列还有元素没有输出,则将剩余元素依次输出。
#include<stdio.h>
#define N 100
int merge(int *a, int left,int mid,int right)
{
int i,j,k=0;
int b[N]={0};
i=left;
j=mid+1;
while(i<=mid&&j<=right) /*把两个序列中小的部分先输入到中间数组*/
{
if(a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while(i<=mid) /*没有输完的序列剩下的依次输入到中间数组*/
b[k++]=a[i++];
while(j<=right)
b[k++]=a[j++];
for(i=0;i<k;i++) /*将排序好的出处在中间数组里的序列输入到a数组*/
a[left++]=b[i];
return 0;
}
int mergesort(int *a,int left,int right) /*将序列划分为等大的两部分再调用排序*/
{
int i,j,mid;
if(right-left>=1)
{
mid=(left+right)/2;
mergesort(a,left,mid);
mergesort(a,mid+1,right);
merge(a,left,mid,right); /*调用排序*/
}
return 0;
}
int main()
{
int a[N]={0},i,n;
printf("please input the length of the list:\n");
scanf("%d",&n);
printf("please input the number of the list:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
mergesort(a,0,n-1);
printf("the sort of the list is :\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}