对两个已排好序的一维数组进行合并并保持同样的排序规则
1. 实验目的
理解线性表的顺序表示和实现,并能灵活运用解决较复杂的问题。
2实验内容
已知两个整数顺序表是有序的, 将之合并为一个有序的顺序表。
这里假设两个已知数组分别为 LA=( 3, 5, 8, 11 ), LB=( 2, 6, 8, 9, 11, 15, 20 ), 并且都已按降序规则排好。
思路分析:
首先需要找到一个更大的空间以能够容纳两个数组
如采用指针操作则可以用 malloc(), 或者 realloc()函数进行重新申请空间大小
/*malloc()函数使用*/
#include <stdlib.h> //定义头文件
void *malloc(int size); //函数声明
//使用方法
//例如分配100个存储空间
int *p;
p = (int *)malloc( sizeof(int) *100);
//详情请参照 (转载) https://blog.csdn.net/linan5231/article/details/50930630
/* realloc()函数使用 */
#include <stdio.h>
void *realloc();
//使用方法
//例如将原来的100个空间变为200个
int *p;
p = (int *)realloc( sizeof(int) *200);
//详情请参照 (转载)https://blog.csdn.net/vevenlcf/article/details/47036127
这里没有采用指针化方式,直接重新申请一个能够容纳原来两个数组的新数组 list[11]
然后对新数组进行插入排序操作
关于插入排序,大家可以看插入排序介绍
下面是实现这道题的代码
#include <stdio.h>
int main()
{
int i, j, temp;
int list_a[4]={3,5,8,11}, list_b[7]={2,6,8,9,11,15,20};
int list[11]={0};
//输出原来的数组数据 并合并到一个新的更大的一维数组中
printf("The original order was:\n");
printf("List A is: \n ");
for(i=0;i<4;++i)
{
list[i]=list_a[i];
printf("%d ",list[i]);
}
printf("\nList B is: \n ");
for(i=4;i<11;++i)
{
list[i]=list_b[i-4];
printf("%d ",list[i]);
}
//对新的一维数组进行选择排序
for(i=1;i<11;++i)
{
temp=list[i];
j=i-1;
while(j>=0 && list[j]>temp)
{
list[j+1]=list[j];
j=j-1;
}
list[j+1]=temp;
}
//将结果打印出来
printf("\n\n\nThe combined sort is:\n ");
for(i=0;i<11;++i)
printf("%d ",list[i]);
return 0;
}
当然这道题也可以采用归并排序,等写好了再贴出来
欢迎大家提供更好的见解
下面是更新内容
将两个已排序的线性表合并为一个线性表,并按照原来的排序规则排序
数据仍采用上面的数据
这次采用C语言的指针进行操作
详细过程见代码注释
#include <stdio.h>
#include <stdlib.h> //for using malloc()
int main() {
int i=0, j=0;
int La[4]= {3,5,8,11};// the first ordered list
int Lb[7]= {2,6,8,9,11,15,20};//the second ordered list
int *pa, *pb, *pc, *p; //pa for La && pb for Lb && pc for Lc (-the new list to restorage)
pa=La;
pb=Lb;
pc = (int *)malloc(11 * sizeof(int)); //requesting dynamic space for the new list
p=pc; // p for working in Lc
while(i < 4 && j < 7) { //两个数组的公共长度部分
if( *(pa+i) <= *(pb+j) )//对两个数组的元素进行大小比较
*(p++)= *(pa+(i++));//如果pa + i 指向的元素较小,则将这个元素放到 Lc 的空间中,并将下标增加
else
*(p++)=*(pb+(j++));//反之则将pb + i 指向的元素放到 Lc 的空间中,并将下标增加
}
while(i<4)
*(p++)= *(pa+(i++));
/*
//经过上面的while循环后,i 的值并没有再次初始化为0 ,所以此时i 的值为while循环结束时的最后的值,如果此时 i 的值小于数组的长度,说明i 中还有元素剩余,将剩下的元素按顺序依次放入Lc 接下来的空间中即可 (注意,两个数组必定只有一个恰好达到而另一个没有)
*/
while(j<7)
*(p++)=*(pb+(j++));
/*
The reason is the same
*/
//将结果打印出来
for(i=0; i<11; ++i)
printf("%d ",*(pc+i));
return 0;
}