码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 线性表--顺序表-1


    文章目录

    • 主要内容
    • 一.基础练习题
        • 1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出位置由最后元素填补,若顺序表为空,则显示出错信息并退出运行。
            • 代码如下(示例):
        • 2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
            • 代码如下(示例):
        • 3.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
            • 代码如下(示例):
        • 4.已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,....,am)和(b1,b2,...bn).编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,...bn)放在(a1,a2,...am)的前面。
            • 代码如下(示例):
        • 5.设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(O
            • 代码如下(示例):
    • 总结

    主要内容

    1. 顺序表基础练习题

    一.基础练习题

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

    代码如下(示例):
    算法思想:搜索整个顺序表,查找最小元素并记住其位置,搜索结束后用最后一个元素填补空出的原最小值元素的位置。
    
    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即为最小值
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    代码如下(示例):
    算法思想:扫描顺序表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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    代码如下(示例):
    算法思想:首先,按顺序不断取下两个顺序表表头较小的节点存入新的顺序表中。
    然后,看哪个表还有剩余,将剩下的部分加到新的顺序表后面。
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    代码如下(示例):
    算法思想:先将数组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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(O

    要求:1) 给出算法的基本设计思想。
    2)根据设计思想,采用 C或 C++或 Java 语言描述算法,关键之处给出注释
    3) 说明你所设计算法的时间复杂度和空间复杂度

    代码如下(示例):
    算法思想:可将这个问题视为把数组 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 中,两个参数分别表示数组中待转换元素的始末位置。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    上述算法中三个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)。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    总结

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

  • 相关阅读:
    9.19~9.20elf论文(浮点数的二进制表示&确定擦除尾随0的数量)
    #边学边考 必修5 高项:对人管理 第1章 项目人力资源管理
    如何使用NE555产生方波
    理解 React 18 中的 useId Hooks
    2.信息收集概述
    virtio-wayland
    c++ vector erase
    自动化测试何时切入?为何选择selenium做UI自动化?
    Java SE 常见问题
    知网CN期刊《新阅读》简介及投稿邮箱
  • 原文地址:https://blog.csdn.net/weixin_59994613/article/details/134490748
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号