用C语言编写一程序,将2个有序的数组合并为一个新将两个递增的有序链表数组

突然想到了这个算法,记得以前看过,但是没写,怕自己会写不出这个算法,于是就把它用JAVA写出来,呵呵。
思想:先依次比较两个数组,按照小的就传入新的数组。当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可。
&1&class&ArraySort&2&{&3&&&&&//两个有序数组的合并函数&4&&&&&public&static&int[]&MergeList(int&a[],int&b[])&5&&&&&{&6&&&&&&&&&int&result[];&&&7&&&&&&&&&if(checkSort(a)&&&&checkSort(b))&&//检查传入的数组是否是有序的&8&&&&&&&&&{&9&&&&&&&&&&&&&result&=&new&int[a.length+b.length];<span style="color: #&&&&&&&&&&&&&<span style="color: #&&&&&&&&&&&&&int&i=<span style="color: #,j=<span style="color: #,k=<span style="color: #;&&&//i:用于标示a数组&&&&j:用来标示b数组&&k:用来标示传入的数组<span style="color: #&<span style="color: #&&&&&&&&&&&&&while(i&a.length&&&&j&b.length)<span style="color: #&&&&&&&&&&&&&&&&&if(a[i]&&=&b[j])&{<span style="color: #&&&&&&&&&&&&&&&&&&&&&result[k++]&=&a[i++];<span style="color: #&&&&&&&&&&&&&&&&&}else{<span style="color: #&&&&&&&&&&&&&&&&&&&&&result[k++]&=&b[j++];<span style="color: #&&&&&&&&&&&&&&&&&}<span style="color: #&<span style="color: #&&&&&&&&&&&&&/*&后面连个while循环是用来保证两个数组比较完之后剩下的一个数组里的元素能顺利传入&*/<span style="color: #&&&&&&&&&&&&&while(i&&&a.length)&<span style="color: #&&&&&&&&&&&&&&&&&result[k++]&=&a[i++];<span style="color: #&&&&&&&&&&&&&while(j&&&b.length)<span style="color: #&&&&&&&&&&&&&&&&&result[k++]&=&b[j++];<span style="color: #&&&&&&&&&&&&&<span style="color: #&&&&&&&&&&&&&return&<span style="color: #&&&&&&&&&}<span style="color: #&&&&&&&&&else&<span style="color: #&&&&&&&&&{<span style="color: #&&&&&&&&&&&&&System.out.print("非有序数组,不可排序!");<span style="color: #&&&&&&&&&&&&&return&null;<span style="color: #&&&&&&&&&}<span style="color: #&&&&&}<span style="color: #&&&&&<span style="color: #&&&&&//检查数组是否是顺序存储的<span style="color: #&&&&&public&static&boolean&checkSort(int&a[])<span style="color: #&&&&&{<span style="color: #&&&&&&&&&boolean&change&=&true;&&//这个标志位是一种优化程序的方法,可以看看我写的冒泡排序优化就会明白了<span style="color: #&&&&&&&&&for(int&i=<span style="color: #;&i&a.length-<span style="color: #&&&&&i++)<span style="color: #&&&&&&&&&{<span style="color: #&&&&&&&&&&&&&for(int&j=i+<span style="color: #;&j&a.&j++)<span style="color: #&&&&&&&&&&&&&&&&&if(a[j-<span style="color: #]&&&a[j])<span style="color: #&&&&&&&&&&&&&&&&&&&&&return&false;<span style="color: #&&&&&&&&&&&&&&&&&else&change&=&false;<span style="color: #&&&&&&&&&}<span style="color: #&&&&&&&&&return&true;&&&&&&&&<span style="color: #&&&&&}<span style="color: #&&&&&<span style="color: #&&&&&//&打印函数<span style="color: #&&&&&public&static&void&print(int&b[])<span style="color: #&&&&&{<span style="color: #&&&&&&&&&&for(int&i=<span style="color: #;&i&b.length&;&i++)<span style="color: #&&&&&&&&&&{<span style="color: #&&&&&&&&&&&&&&System.out.print(b[i]&+&(i%<span style="color: #&==<span style="color: #&?&"\n":"\t"));<span style="color: #&&&&&&&&&&}<span style="color: #&&&&&}<span style="color: #&&&&&<span style="color: #&&&&&public&static&void&main(String&args[])<span style="color: #&&&&&{<span style="color: #&&&&&&&&&int&a[]={<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #};<span style="color: #&&&&&&&&&int&b[]={<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #,<span style="color: #};<span style="color: #&&&&&&&&&int&c[]=&MergeList(a,b);<span style="color: #&&&&&&&&&if(c!=null)<span style="color: #&&&&&&&&&print(c);<span style="color: #&&&&&&&&&else<span style="color: #&&&&&&&&&&&&&System.out.println("");<span style="color: #&&&&&}<span style="color: #&}
总结:这个算法应该算是经典的了,一定要记住,这一部分应该是数据结构中的链表中的内容。
阅读(...) 评论()2016年10月优秀大版主2016年8月优秀大版主
2016年9月 总版技术专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。本文讲的是C语言实现在数组A上有序合并数组B的方法_C 语言,
本文实例讲述了C语言实现在数组A上有序合并数组B的方法,分享给大家供大家参考。具体分析如下:
题目:数组A和数组B均有序,数组A有足够大内存来容纳数组B,将数组B有序合并到数组A中
分析:如果由前至后合并,复杂度将会是O(N2),这样的复
本文实例讲述了C语言实现在数组A上有序合并数组B的方法,分享给大家供大家参考。具体分析如下:
题目:数组A和数组B均有序,数组A有足够大内存来容纳数组B,将数组B有序合并到数组A中
分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2)
由此可以写出下面的代码:
#include &iostream&
#include &algorithm&
#include &iterator&
int arrayA[10] = {1, 3, 5, 7, 9};
int arrayB[] = {2, 4, 6, 8, 10};
const int sizeB = sizeof arrayB / sizeof *arrayB;
const int sizeA = sizeof arrayA / sizeof *arrayA - sizeB;
int* mergeArray(int *arrayA, int sizeA, int *arrayB, int sizeB)
if (arrayA == NULL || arrayB == NULL || sizeA & 0 || sizeB & 0)
return NULL;
int posA = sizeA - 1;
int posB = sizeB - 1;
while (posA &= 0 && posB &= 0)
if (arrayA[posA] & arrayB[posB])
arrayA[posA + posB + 1] = arrayB[posB];
arrayA[posA + posB + 1] = arrayA[posA];
copy(arrayA, arrayA + 10, ostream_iterator&int&(cout, " "));
system("pause");
return arrayA;
void main()
int *result = mergeArray(arrayA, sizeA, arrayB, sizeB);
copy(result, result + 10, ostream_iterator&int&(cout, " "));
代码写完后似乎完成了所需功能,但还不止于此,必须对上述代码做UT
arrayA或arrayB为空,长度小于0
2. 边界用例
arrayA为空,长度为1;arrayB不为空,长度大于1
首元素用例
const int size = 6;
int arrayA[size] = {2};
int arrayB[] = {0, 1, 1, 1, 1};
const int size = 6;
int arrayA[size] = {0, 1, 1, 1, 1};
int arrayB[] = {2};
3. 正常用例:
const int size = 10;
int arrayA[size] = {1, 3, 5, 7, 9};
int arrayB[] = {2, 4, 6, 8, 10};
const int size = 10;
int arrayA[size] = {2, 4, 6, 8, 10};
int arrayB[] = {1, 3, 5, 7, 9};
const int size = 10;
int arrayA[size] = {1, 2, 3, 4, 5};
int arrayB[] = {6, 7, 8, 9, 10};
const int size = 10;
int arrayA[size] = {6, 7, 8, 9, 10};
int arrayB[] = {1, 2, 3, 4, 5};
经过上面的测试,不难发现在边界条件用例中,代码已经不能正确运行出结果,在测试用例的驱动下,不难写出正确代码如下:
int* mergeArray(int *arrayA, int sizeA, int *arrayB, int sizeB)
if (arrayA == NULL || arrayB == NULL || sizeA & 0 || sizeB & 0)
return NULL;
int posA = sizeA - 1;
int posB = sizeB - 1;
while (posA &= 0 && posB &= 0)
if (arrayA[posA] & arrayB[posB])
arrayA[posA + posB + 1] = arrayB[posB];
arrayA[posA + posB + 1] = arrayA[posA];
copy(arrayA, arrayA + size, ostream_iterator&int&(cout, " "));
system("pause");
//出现两种情形:
//1. posA & 0 && posB &= 0
//2. posA &= 0 && posB & 0
//只有第1种情形需要进行处理
if (posA & 0 && posB &= 0)
while (posB &= 0)
arrayA[posA + posB + 1] = arrayB[posB];
return arrayA;
相信本文所述对大家C程序算法设计的学习有一定的借鉴价值。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
c语言将两个数组合并、c语言数组合并、c语言合并两个数组、c语言中两个数组合并、c语言创建有序链表,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
的信息,还有c语言将两个数组合并、c语言数组合并、c语言合并两个数组、c语言中两个数组合并、c语言创建有序链表等
,所有相关内容均不代表云栖社区的意见!

我要回帖

更多关于 怎么编写程序 的文章

 

随机推荐