问题描述
给定一个数列,用归并排序算法把它排成升序
输入格式
第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。
输出格式
输出排序后的数列,每个数字占一行。
样例输入
5
3 2 1 4 5
样例输出
1
2
3
4
5
思路:
写出归并排序的核心代码。归并排序代码是典型的分治法,分而治之。
拆分:merge函数,传递参数(数组、长度),采用二分法,左边为list1,右边为list2,*list1指向第一个数组元素,*list2指向第二个数组元素,运用递归多次拆分直至单个元素。
合并:mergeing 函数,传递参数(*list1,*list2,list1长度,list2长度),判断元素大小,从小到大排序所以将小元素放入临时数组中,循环放入,如果最后数组中还有剩余元素,全部放入临时数组中,最后将临时数组赋值给数组1
具体代码
# include <stdio.h>
# define N 1000
//归并排序核心
//合并
void mergeing (int* list1,int list1_size,int* list2,int list2_size)
{
int i,j,k,z;
int temp[N];
i=j=k=0;
while(i<list1_size&&j<list2_size)
{
if(list1[i]<list2[j])
temp[k++]=list1[i++];
else
temp[k++]=list2[j++];
}
while(i<list1_size)
temp[k++]=list1[i++];
while(j<list2_size)
temp[k++]=list2[j++];
for(z=0;z<(list1_size+list2_size);z++)
list1[z]=temp[z];
}
//分离
void merge (int a[],int n)
{
if(n>1)
{
int *list1=a;
int list1_size=n/2;
int *list2=a+list1_size;
int list2_size=n-list1_size;
merge (list1,list1_size);
merge (list2,list2_size);
mergeing (list1,list1_size,list2,list2_size);
}
}
int main()
{
int a,b[N];
int i;
printf("输入数据个数\n");
scanf("%d",&a);
printf("输入具体数据\n");
for(i=1,scanf("%d",&b[i-1]);getchar()!='\n';i++)
{
scanf("%d",&b[i]);
}
merge(b,a);
for(i=0;i<a;i++)
{
printf("%d\n",b[i]);
}
return 0;
}