themass下载:一道PASCAL语言题!

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 19:35:43
设有两组数据,它们均按以大到小的顺序排列,请用线性表的顺序存储结构将这两组数合并到一起,要求合并后仍按从大到小的顺序排列。

请高手们把源程序发上来,并请说明一下算法!

我n年以前编过.这是归并排序的基础.我就直接在这里写了.如果有小错请谅解.
const
maxn=1000;
var
n,i,j,la,lb,lc:integer;
a,b,c:array[1..maxn]of integer;
begin
la:=0;
while not eoln do
begin
inc(la);
read(a[la]);
end;
lb:=0;
while not eoln do
begin
inc(lb);
read(b[lb]);
end;
lc:=la+lb;
while (la+lb)>0 do
begin
if a[la]<b[lb] then
begin
c[la+lb]:=a[la];
la:=la-1;
end else
begin
c[la+lb]:=b[lb];
lb:=lb-1;
end;
end;
for i:=1 to lc do
write(c[i],' ');
end.

PASCAL的我忘了语法了...用C++的行不行呀...
下面,我主要用程序来说明算法....(会用到一些比较另类的技巧,请楼主好好想想,对以后会有所帮助的)

假设: 两个数组分别为A和B.其中,逻辑上两数组都是与十六进制数FFFFFFFF为结束符...合并后的链表逻辑上用NULL为结束符. 则C++的编程如下...

struct Mlink //定义链表结构
{
int data;
Mlink *next;
}
Mlink *ML(int *A; int *B)
{
Mlink *lp,*head; //lp用来指向最后一个待添加数据的指针. head用来存放头指针

int i,j; //被大循环用的AB数组下标...

int n,max,*pab; //为简化源代码而特意定义的,请仔细思考下面的循环体.其中,max代表比较中的最大值,pab指向那组比max小的数组首地址,n专为互换i,j数组下标而设下的

lp=new Mlink;
head=lp;//初始化链表...也就是产生第一项并在赋给head保存

for (i=0,j=0;(A[i]!=0xFFFFFFFF)&&(B[j]!=0xFFFFFFFF);)
//遍历A和B的所有数据,直到有其中一组碰到结束符为止...
//PS:下面的循环体逻辑比较复杂,我不知怎么说清楚,楼主仔细想想吧...:)
//注,这个循环用到了一个灵活使有变量的技巧..
//建议楼主好好分析...会对你以后有很大的帮助的...
{
if (A[i]>B[j]) {pab=B[0]; max=A[i]; n=j;}
else {pab=A[0]; max=B[j]; n=i;}
//这个条件是关键,目的是使得下面的一个小循环得以统一执行...

lp->data=max;
lp->next=new Mlink;
lp=lp->next;
for (; (pab[n]<=max)&&(pab[n]!=0xFFFFFFFF); n++)
{
lp->data=pab[n];
lp->next=new Mlink;
lp=lp->next;
}
if (pab[n]!=0xFFFFFFFF) break; //发现有数组终止,强制跳出该循环...

//-----------------------------------
if (A[i]>B[j]) {j=n; i++;}
else {i=n; j++;}
//这个条件的作用相当于把前面统一的结果分解出来,以便大循环体能正常工作...

}
//下面又是一个特意通过pab指针的简化代码的方法,这逻辑比较简单....
int *pab;
if (A[i]==0xFFFFFFFF) pab=&B[i];
else pab=&A[i];
for (; pab[i]!=0xFFFFFFFF; i++)
{
lp->data=pab[i];
lp->next=new Mlink;
}
delete lp->next;
lp->next=NULL;
return(head);
}

PS:PASCAL我是很久以前学的,关键词几乎都忘了,不好意思! 以上的程序使用的技巧,希望楼主能多想想...肯定会对你以后有作用的...:)

~欢迎播旗~(嘿嘿)

算法名称:归并排序
具体忘了。。。
可以在oibh的论坛上查一下