归并排序算法
首先一个问题,如何将两个整数进行升序排序?
这不简单吗。将两个数比较,再将小的放在前面,大的放在后面。
然后如何将两个升序的数组排序为一个数组呢?
我知道我知道!创建第三个数组,将需要那两个数组按下标顺序进行比较,然后将小的数放入第三个数组中,在将两者下标加一。
如,将A数组与B数组的第一个元素比较,假如A小,就将A第一个元素存入temp第一个位中中,然后A与team下标加一
不错,那比较完多出来的元素呢?
直接接到temp后面就可以了
是这样的,那么如何将一个数组用刚刚的方法进行升序呢?
我们知道,这个方法是两个单独的数进行比较。
于是便可以知道,我们要做的第一步便是将数组转化为一个一个的数,然后再将
两个单独的数
进行比较排序,变成
两个有顺序的数组,
再通过上面的方法,将两个有顺序的数组变成一个有顺序的数组,
依次直到最终变为一个有顺序的数组,这便是归并排序的递归法
以下是代码:
#include<stdio.h>
#define MAX_SIZE 15
void merging(int *list1,int *list2,int list1_size,int list2_size)//数组排序
{
int temp[MAX_SIZE];
int i,j,k,m;
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(m=0; m<(list1_size+list2_size); m++)
{
list1[m] = temp[m];
}
}
void mergesort(int list[],int len)//数组拆分
{
if(len>1)
{
int list1_size,list2_size;
int *list1 = list;
list1_size = len/2;
int *list2 = list+(len/2);
list2_size = len-list1_size;
mergesort(list1,list1_size);
mergesort(list2,list2_size);
merging(list1,list2,list1_size,list2_size);
}
}
int main(void)
{
int i;
int list[10] = {5,6,0,4,2,6,5,8,4,2};
mergesort(list,10);
printf("排序后的结果是");
for(i=0; i<10; i++)
{
printf("%d ",list[i]);
}
return 0;
}