归并排序算法
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如 设有数列{6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
i=3 [ 1 6 8 38 100 202 301 ] 4
总计: 11次
具体实现方法:
#include "stdio.h"
#include "stdlib.h"
#include"string.h"
#include"malloc.h"
void merge(int arry[],int low,int mid,int high,int temp[])
{
int begin1,end1,begin2,end2,k=0,i;
begin1=low; end1=mid; begin2=mid+1; end2=high;
while(begin1<=end1&&begin2<=end2)
{
if(arry[begin1]<arry[begin2])
temp[k++]=arry[begin1++];
else
temp[k++]=arry[begin2++];
}
while(begin1<=end1)
temp[k++]=arry[begin1++];
while(begin2<=end2)
temp[k++]=arry[begin2++];
for( i=0;i<k;i++)
arry[low+i]=temp[i];
return ;
}
void mergesort(int arry[],int low,int high,int temp[])
{
int mid=0;
if(low<high)
{
mid=(low+high)/2;
mergesort(arry, low, mid , temp);//左边有序
mergesort(arry, mid+1, high, temp);//右边有序
merge(arry, low, mid, high, temp);//合并
}
return ;
}
void creat(int arry[],int n)
{
int *temp;
temp=(int*)malloc(100*sizeof(int));
mergesort(arry,0,n-1,temp);
}
int main()
{
int arry[100],i,n;
while(scanf("%d",&n),n!=0)
{
for(i=0;i<n;i++)
scanf("%d",&arry[i]);
printf("排序前的:\n");
for(i=0;i<n;i++)
printf("%d ",arry[i]);
printf("\n");
creat(arry,n);
printf("排序后的:\n");
for(i=0;i<n;i++)
printf("%d ",arry[i]);
printf("\n");
}
return 0;
}