求解c语言数组排序的题目!!?

来源:百度知道 编辑:UC知道 时间:2024/05/15 00:47:11
使两个有序数列合并成一个有序数列,合并后的数列仍然有序。注意不得采用重新排序的方法。
解法如下:
已知数组list1和list2中的数据元素按非递减有序排列,将list1和list2表中的数据元素合并成一个新的数组list2.
#include<stdio.h>
#define maxnum 20
main()
{
int list1[maxnum]={3,4,7,12,15},list2[maxnum]={2,5,7,15,18,19};
int list3[maxnum*2];
int num1=4,num2=5,num3;
int i,j,k;
if(num1+num2>2*maxnum)
{
printf("\n数组下界溢出!");
return 0;
}
i=j=k=0;
while(i<num1&&j<=num2)
{
if(list1[i]<list2[j])
list3[k++]=list1[i++];
else
list3[k++]=list2[j++];
}
/*处理剩余部分*/
while(i<num1)
list3[k++]=list1[i++];
while(j<num2)
list3[k++]=list2[j++];
num3=k-1;
printf("\nNew data is :\n");
for(i=0;i<=num3;i++)
printf("%4d",list3[i]);
printf("\n");
return 1;
}

各位朋友能帮我解释下
while(i<num1)
list3[k++]=list1[i++];
while(j<num2)

这是在讲 归并排序 的原理

while(i<num1)
list3[k++]=list1[i++];
while(j<num2)
list3[k++]=list2[j++];
num3=k-1;

由于在前面的一段程序完成后,可能会出现这样的情况:一个原数组中的元素已经取完,但是另一个原数组的元素还没有取完。

后面的这段程序就是用于处理这种情况,
假如是第一个数组中的元素没有取完,那么i一定小于num1,那么此时就用
while(i<num1)
list3[k++]=list1[i++];
将第一个数组中的元素全部附加到新的数组中,由于这些元素都已经排序,所以这样做不会导致顺序被打乱。

如果是第二个数组中的元素没有取完,那么j一定小于num2,那么此时就用
while(j<num2)
list3[k++]=list2[j++];
将第二个数组中的剩余元素全部附加到新的数组中。

这些过程全部结束后,k-1就是新数组的长度,所以将k-1赋予num3存储list3数组的元素个数。