概述
交集
Sqlist IntersectionArray(Sqlist a, Sqlist b)
{
Sqlist c;
InitList(c); int k = 0;
for (int i = 0; i < a.length; i++)
{
for (int j = 0; j < b.length; j++)
{
if (a.data[i] == b.data[j])
{
c.data[k] = a.data[i];
k++;
}
}
}
c.length = k;
return c;
}
并集
一定要注意,在for (k = 0; k < a.length; k++)循环结束后k=a.length。
void Union(Sqlist a, Sqlist b, Sqlist &c)
{
int k;
for (k = 0; k < a.length; k++)
c.data[k] = a.data[k];
//一定要注意循环完之后K=a.length
for (int j = 0; j < b.length; j++)
{
int m = 0;
for (int i = 0; i < a.length; i++)
{
if (a.data[i] == b.data[j])
{
m++;
break;
}
}
if (m == 0)
{
c.data[k++] = b.data[j];
}
}
c.length = k ;
}
二路并归
一定不要忘了最后给C.length赋值
void Merge(Sqlist a, Sqlist b, Sqlist &c)
{
int i, j, k;
i = j = k = 0;
while (i < a.length&&j < b.length)
{
if (a.data[i] < b.data[j])
{
c.data[k] = a.data[i];
k++;
i++;
}
else {
c.data[k] = b.data[j];
k++;
j++;
}
}
c.length = k;
}
对比下链表的二路并归算法
void Merge(lnode *a, lnode *b, lnode *&c)
{
lnode *pa = a->next, *pb = b->next;
c = a;//a的头结点用于c头结点
lnode *prec=c;//插入元素需要知道前驱结点
delete b;
while (pa&&pb)
{
if (pa->data < pb->data)
{
prec->next = pa;
prec = pa;
pa = pa->next;
}
else {
prec->next = pb;
prec = pb;
pb = pb->next;
}
}
prec->next = NULL;
if (pa)
prec->next = pa;
else
prec->next = pb;
}
一个例子
有两个递增有序顺序表A、B,分别含有N和M个整数元素(假设这N+M个元素各不相同)。设计一个尽可能高效的算法,求这N+M个元素中第k小的元素(如果参数k错误返回0,否则返回1,并且用参数e表示求出第k个小的元素)。
int Topk(Sqlist a, Sqlist b, int &e, int k) //第k小的元素
{
int i=0, j=0;
if (k<1 || k>a.length + b.length)
{
return 0;
}
while (i < a.length&&j < b.length)
{
k--;
if (a.data[i] < b.data[j])
{
if (k == 0)
{
e = a.data[i];
return 1;
}
i++;
}
else
{
if (k == 0)
{
e = b.data[j];
return 1;
}
j++;
}
}
if (i < a.length)
e = a.data[i + k - 1];
else if (j < b.length)
e = b.data[j + k - 1];
return 1;
}
难点在于下标的序数e = a.data[i + k - 1];
最后
以上就是活泼歌曲为你收集整理的数据结构入门系列——用顺序表解决实际问题的全部内容,希望文章能够帮你解决数据结构入门系列——用顺序表解决实际问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复