数据结构入门系列——用顺序表解决实际问题

交集

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];

你可能感兴趣的:(数据结构)