将两个一维数组合并

对两个已排好序的一维数组进行合并并保持同样的排序规则
1. 实验目的
理解线性表的顺序表示和实现,并能灵活运用解决较复杂的问题。
2实验内容
已知两个整数顺序表是有序的, 将之合并为一个有序的顺序表。

这里假设两个已知数组分别为 LA=( 3, 5, 8, 11 ), LB=( 2, 6, 8, 9, 11, 15, 20 ), 并且都已按降序规则排好。

思路分析
首先需要找到一个更大的空间以能够容纳两个数组
如采用指针操作则可以用 malloc(), 或者 realloc()函数进行重新申请空间大小

/*malloc()函数使用*/
#include   //定义头文件
void *malloc(int size);  //函数声明

//使用方法
//例如分配100个存储空间
int *p;
p = (int *)malloc( sizeof(int) *100);

//详情请参照 (转载) https://blog.csdn.net/linan5231/article/details/50930630
/*  realloc()函数使用  */
#include 
void *realloc();

//使用方法
//例如将原来的100个空间变为200个
int *p;
p = (int *)realloc( sizeof(int) *200);

//详情请参照 (转载)https://blog.csdn.net/vevenlcf/article/details/47036127

这里没有采用指针化方式,直接重新申请一个能够容纳原来两个数组的新数组 list[11]
然后对新数组进行插入排序操作
关于插入排序,大家可以看插入排序介绍

下面是实现这道题的代码

#include 
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 
#include  //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;
}

你可能感兴趣的:(C语言,数组,排序,合并,线性表,指针)