两个顺序表sa,sb,其元素均为递增有序,将此列表归并成sc,并保持递增顺序

作者&投稿:毓芳 (若有异议请与网页底部的电邮联系)
将两个各有n个元素的有序表归并成一个有序表,其最多的比较次数是多少次?~

最多n(n-1)/2
例如1,3,5,7,9跟10,8,6,4,2最少n-1次
例如1,3,5,7,9跟2,4,6,8,10
因为是有序表,2插到1后面以后,只需要将4和3做比较,前面的不用再比了,因此n-1次

。。。

// 2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
/*有两个顺序表La ,Lb 其数据元素均按从小到大的升序排列。
要求将这个线性表合并为一个表Lc,Lc的元素也按照从小到达升序排列
*/

/*算法:首先建立顺序表Lc,使得Lc的大小等于La+Lb.依次扫描顺序表la lb,
比较当前的元素值,将值小的复制给lc,直到一个顺序表扫描完。
将未完成的顺序表余下部分直接赋值给lc
*/

#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int *arrary;
int length; /*线性表当前元素个数*/
int listsize;/*顺序表当前大小*/
}Seqlist;
Seqlist La,Lb,Lc;
int mergelist(Seqlist La,Seqlist Lb,Seqlist *Lc);

int main (void)
{
int i,j;
La.arrary=(int *)malloc(sizeof(int)*10);
for(i=0,j=1;j<20;j=j+2)
La.arrary[i++]=j;
printf("La=");
for(i=0;i<10;i++)
printf("%2d " ,La.arrary[i]);

Lb.arrary=(int *)malloc(sizeof(int)*10);
for (i=0,j=2;j<=20;j=j+2)
Lb.arrary[i++]=j;
printf("\nLb=");
for(i=0;i<10;i++)
printf("%2d " ,Lb.arrary[i]);

La.length=10;
Lb.length=10;
mergelist(La,Lb,&Lc);
printf("\nLc=");
for(i=0;i<Lc.listsize;i++)
printf("%2d " ,Lc.arrary[i]);
printf("\n");
return 0;
}

int mergelist(Seqlist La,Seqlist Lb,Seqlist *Lc)
{
int *p,i,j,k;
Lc->listsize=Lc->length=La.length+Lb.length;
Lc->arrary=(int *)malloc(sizeof(int)*Lc->listsize);/*建立Lc表*/
if(!Lc->arrary)
printf("fail .\n");
p=Lc->arrary;
i=j=k=0;
while(i<La.length&&j<Lb.length)
{
if(La.arrary[i]<Lb.arrary[j])
{
Lc->arrary[k]=La.arrary[i];
i++;
k++;
}
else
{
Lc->arrary[k]=Lb.arrary[j];
j++;
k++;
}
}
while(i<La.length)
{
Lc->arrary[k]=La.arrary[i];
i++;
k++;
}
while(j<Lb.length)
{
Lc->arrary[k]=Lb.arrary[j];
j++;
k++;
}
return 1;
}

表的节点发下~

数据结构(C++)顺序表的问题 结果不能对表A和B进行排序 而且C表第一...
答:你的连表第一个结点没初始化,所以链表第一个数都是个那个地址内的值下面图中可以看出你的链表C首地址是0x00382798 里面的值是-858993460 所以输出链表中就会一直有这个值 你再看看,把链表初始化一下

生活常识趣味选择题
答:(用S表示)关系为Sa=Sb>Sc C、t2℃时,a、c两物质的溶解度相等 D、t2℃时,将a、b、c三种物质的饱和溶液降温,其质量分数都变大 9、取三种植物的...两个一定改变,一个可能改变: (1)五个不改变:认宏观看元素的种类和反应物和生成物的总质量不变,从微观看原子质量、原子的种类和原子数目不变; (2)两...

用java编写一个数据结构的题!
答:线性表跟是不是数组没关系啊。。。栈和队列都是线性表吧。。不太懂你的意思。。public class SeqList { public static void main(String[] args) { int[] a = new int[]{1,2,3,4,5,6,7};int[] b = new int[]{3,5,8,9};int[] c = new int[a.length + b.length];new ...

解释下面C语言程序(合并顺序表,有顺序表La,Lb)
答:因为顺序表La、Lb都已经排好序了,那么要将他们合并成有序表放在Lc中,将La和Lb从他们的初始元素进行比较,谁小就将谁放入到Lc中,同时Lc和放入元素的顺序表都指向下一个元素,然后继续循环。最后肯定会有一个顺序表先为空,那么就把不为空的顺序表中的元素直接复制到表Lc中即可。

化学解析
答:金属元素的原子在化学反应中,通常表现出失去电子成为阳离子的倾向。金属性的强弱通常用金属元素原子的最外层电子的电离能(气态原子失去电子成为气态阳离子时所需要的能量)大小来衡量。金属的活动性是反映金属在水溶液里形成水合离子倾向的大小,也就是反映金属在水溶液里起氧化反应的难易,它是以金属的...

c++编程问题
答:SC.last=SA.last+SB.last+l;l 换成 i 抄代码小心点!

如何通过箱号看人民币冠号和流水码
答:(2)第二个汉字比如扛:表示是扛组(第5.6大组),人民币有他所对应的冠号印制顺序表。 (3)第三个汉字比如扎:用右边的笔划加1就是2划,人民币冠号印制顺序表的组别中依次找到他所对应的组冠。 (4)第四个汉字比如打:用右边的笔划直接在组冠中找到所对应的冠号。 后面的三个字是个暗语数字:扎-1 打-2 ...

有没有数据结构(C语言版)的资料
答:1.线性表的相关基本概念,如:前驱、后继、表长、空表、首元结点,头结点,头指针等概念。2.线性表的结构特点,主要是指:除第一及最后一个元素外,每个结点都只有一个前趋和只有一个后继。3.线性表的顺序存储方式及其在具体语言环境下的两种不同实现:表空间的静态分配和动态分配。静态链表与顺序表的相似及不同之...

【数据结构·C语言】请高手帮忙检查一个关于【链表的归并】算法是否正确...
答:A.length-1]);p++) *p=*(p+1);其他的都还好。PS,如果想程序运行简单一点,建议你每归并一个B的元素到A就查找一遍A中的元素,但是程序就会麻烦一点,还有,对A的重复元素的自检,可以考虑把if写为while,因为考虑到又可以能连着三个以上的元素相等。希望采纳,期待对你有帮助,欢迎追问^_^ ...

线性表最主要的两个应用是?他们之间最重要的区别是?
答:队列和堆栈 队列是先进先出FIFO 堆栈是先进后出FILO