使用分治法的兩路合並排序算法:
將待排序的元素序列一分為二,得到長度基本相等的兩個子序列,分別排序。
如果子序列較長,還可繼續細分,直到子序列的長度不超過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;
}