线性表--顺序表-1

文章目录

主要内容

  1. 顺序表基础练习题

一.基础练习题

1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出位置由最后元素填补,若顺序表为空,则显示出错信息并退出运行。

代码如下(示例):
c 复制代码
算法思想:搜索整个顺序表,查找最小元素并记住其位置,搜索结束后用最后一个元素填补空出的原最小值元素的位置。

bool Del_Min(sqList &L,ElemType &value){
//删除顺序表L中最小元素结点,并通过引用型参数value返回其值
//若删除成功,则返回true;否则返回false
	if(L.length==0)
		return false; //表空,中止操作返回
	value=L.data[0];
	int pos=0; //假定0号元素的值最小
	for(int i=1;i<L.length;i++) //循环,寻找具有最小值的元素
		if(L.data[i]<value){ //让value记忆当前具有最小值的元素
		value=L.data[i];
		pose=i;
		}
	L.data[pos]=L.data[L.length-1]; //空出的位置由最后一个元素提填补
	L.length--;
	return true; //此时,value即为最小值
}

2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

代码如下(示例):
c 复制代码
算法思想:扫描顺序表L的前半部分元素,对于元素L.data[i](0<=i<L.length/2),
将其与后半部分的对应元素L.data[L.length-i-1]进行交换。
 
void Reverse(Sqlist &L){
	Elemtype temp; //辅助变量
	for(i=0;i<L.length/2;i++){
	temp=L.data[i]; //交换L.data[i]与L.data[L.length-i-1]
	L.data[i]=L.data[L.length-i-1];
	L.data[L.length-i-1]=temp;
	}
}

3.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

代码如下(示例):
c 复制代码
算法思想:首先,按顺序不断取下两个顺序表表头较小的节点存入新的顺序表中。
然后,看哪个表还有剩余,将剩下的部分加到新的顺序表后面。

bool Merge(SeqList A,SeqList B,SeqList &C){
//将有序顺序表A和B合并为一个新的有序顺序表C
	if(A.length+B.length>C.maxSize) //大于顺序表的最大长度
		return false;
	int i=0,j=0,k=0;
	while(i<A.length&&j.B.length){
		if(A.data[i]<=B.data[j])
			C.data[k++]=A.data[i++];
		else
			C.data[k++]=B.data[j++];
	}
	while(i<A.length) //还剩一个没有比较完的顺序表
		C.data[k++]=A.data[i++];
	while(j<B.length)
		C.data[k++]=B.data[j++];
	C.length=k;
	return true;
}

4.已知在一维数组Am+n中依次存放两个线性表(a1,a2,...,am)和(b1,b2,...bn).编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,...bn)放在(a1,a2,...am)的前面。

代码如下(示例):
c 复制代码
算法思想:先将数组A[m+n]中的全部元素(a1,a2,...am,b1,b2,...bn)原地逆置为(bn,bn-1,...b1,am,am-1,..a1),
再对前n个元素和后m个元素分别使用逆置算法,即可得到(b1,b2,..bn,a1,a2,...am),从而实现顺序表的位置互换。

 typedef int DataType;
 void Reverse(DataType A[],int left,int right,int arraySize){
 	if(left>=right || right>=arraySize)
 		return;
 	int mid=(left+right)/2;
	for(i=0;i<mid-left;i++){
		DataType temp=A[left+i];
		A[left+i]=A[right-i];
		A[right-i]=temp;
	}
}
void Exchange(DataType A[],int m,int n,int araySize){
	Reverse(A,0,m+n-1,arraySize);
	Reverse(A,0,n-1,arraySize);
	Reverse(A,n,m+n-1,arraySize);
}

5.设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(O<p<n)个位置,即将R中的数据由(X0,X1,...,Xn-1)变换为(Xp,Xp+1,...,Xn-1,X0,X1,...Xp-1)。

要求:1) 给出算法的基本设计思想。

2)根据设计思想,采用 C或 C++或 Java 语言描述算法,关键之处给出注释

  1. 说明你所设计算法的时间复杂度和空间复杂度
代码如下(示例):
c 复制代码
算法思想:可将这个问题视为把数组 ab 转换成数组 ba(a代表数组的前p 个元素,b代表数组中余下的n-p个元素),
先将a逆置得到a^(-1)b,再将b逆置得到a^(-1)b^(-1),最后将整个a逆置得到(a^(-1)b^(-1))^(-1))= ba。
设 Reverse 函数执行将数组元素逆置的操作,对abcdefgh 向左循环移动3(p=3)个位置的过程如下:
Reverse(0,p-1)得到 cbadefgh:
Reverse(pn-1)得到 cbahgfed;
Reverse(0,n-1)得到defghabc;
注:Reverse 中,两个参数分别表示数组中待转换元素的始末位置。
c 复制代码
void Reverse(int R[],int from,int to){
	int i,temp;
	for(i=0;i<(to-from+1)/2;i++)
	{temp=R[from+i];R[from+i]=R[to-i];R[to-i]=temp;}
} //Reverse
void Converse(int R[],int n,int p){
	Reverse(R,0,p-1);
	Reverse(R,p,n-1);
	Reverse(R,0,n-1);
}
c 复制代码
上述算法中三个Reverse函数的时间复杂度分别为 O(p/2)、O((n-p)/2)和 0(n/2),
故所设计的算法的时间复杂度为 O(n),空间复杂度为 O(1)。
另解,借助辅助数组来实现。
算法思想:创建大小为p的辅助数组 S,将R中前p 个整数依次暂存在 S中,同时将 R中后 n-p 个整数左移,
然后将 S中暂存的p个数依次放回到R中的后续单元。时间复杂度为 O(n),空间复杂度为 O(p)。

总结

以上是今天要讲的内容,练习了一些线性表--顺序表的习题。

相关推荐
骇客野人5 小时前
Redis 完整安装部署方案(Linux,分【源码编译】+【Docker】两种,推荐生产用源码,测试快速用 Docker)
运维
aramae7 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能8 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
无敌贵点大王8 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
淡海水8 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
Logic1018 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
蓝速科技9 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
chicheese9 小时前
Linux 面试速查表:从初级到高级,附高频场景答题模板
linux·运维
Linux-lucky10 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
智能运维指南10 小时前
2026年ITSM系统怎么选?四款主流方案与五维评估模型
运维·itsm·嘉为蓝鲸