数据结构
主要是以清华大学严蔚敏老师编写的C语言版教材为依据,大部分算法都来自于2020版王道数据结构课后习题,还有就是,这是考研期间记不住代码想着打出来可能记得效果好一点
少年少年少年奋斗奋斗奋斗
不积跬步,无以至千里
展开
-
求两个相等长度的升序序列的中位数,要求时间和空间利用率低
问题描述:一个长度为L(L>=1)的升序序列S,处在第个位置的数称为S的中位数。例如,若序列=(11,13,15,17,19),则的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若=(2,4,6,8,20),则和的中位数是11。现在有两个等长升序序列A和B,设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。算法设计思想: Step1 分别求两个升序序列A和B的中位数,设为a和b;Step2 若a=b,则a或b即为所求的中位数,算法结束;(因为.原创 2020-09-07 18:26:38 · 641 阅读 · 0 评论 -
将数组中的元素循环左移p位,且要求时间和空间两方面尽可能高效
问题描述:将n(n>1)个整数存放在一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据(x0,x1,x2,...x(n-1))变换为(xp,x(p+1),...,x(n-1),x0,x1,...,x(p-1))。算法设计思想:可以将线性表中前p个元素当成一个数组,第p+1到第n个元素当成一个数组,然后问题就转化为了将数组中的两个线性表位置互换,即,先将前半部分逆置,再将后半部分逆置,最后将整个表逆置(参见:数.原创 2020-09-06 17:52:55 · 998 阅读 · 0 评论 -
用最短时间查找有序顺序表中的x,找不到则插入
问题描述:线性表(a1,a2,a3,...,an)中的元素递增有序且按顺序存储于计算机中。设计一算法,完成用最少时间在表中查找数值为x的元素,若找到则将其与后继元素想交换,若找不到则将其插入表中并使表中元素仍旧有序。算法设计思想:因为线性表递增有序,又要求时间最短查找,所以使用折半查找法最好。代码及结果:#include<stdio.h>#include "线性表的顺序表示和实现.cpp"void SearchExchangeInsert(SqList &..原创 2020-09-05 17:34:18 · 1370 阅读 · 0 评论 -
数组中两线性表位置互换且空间复杂度为O(1)
问题描述:在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3...am)和(b1,b2,b3...bn)。编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3...bn)放在(a1,a2,a3...am)的前面。算法设计思想:首先将数组中的全部元素(a1,a2,a3...am,b1,b2,b3...bn)原地逆置为(bn...b3,b2,b1,am...a3,a2,a1),然后再将前n个元素和后m个元素分别逆置,从而实现顺序表的位置互换。代码及结果:#inc..原创 2020-09-05 15:43:53 · 565 阅读 · 0 评论 -
将两个顺序表合并为一个新的顺序表
问题描述:将两个有序顺序表合并为一个新的有序顺序表,并有函数返回结果顺序表。要求时间复杂度O(n)算法设计思想:首先,按顺序取两个顺序表表头较小的结点存入新的线性表中直到某一个表遍历完;然后将还有剩余元素的表的剩下结点加到新的顺序表后。代码及结果:#include<stdio.h>#include "线性表的顺序表示和实现.cpp"bool Merge(SqList &A,SqList &B,SqList &L){ //将有序顺序表A和B合.原创 2020-09-04 00:23:58 · 12483 阅读 · 2 评论 -
删除有序顺序表中相同的元素,要求时间复杂度为O(n)
问题描述:从有序表中删除所有值重复的元素,使表中元素均不同。算法设计思路:因为是顺序表,所以相同的元素一定在连续的位置上。基于此,初始时,将第一个元素看做是非重复的有序表,之后依次判断后面的元素是否与前面非重复有序表的最后一个元素相同,若相同则继续向后判断,不相同则插入到前面的非重复有序表的最后,直至判断结束为止。代码及结果:#include<stdio.h>#include "线性表的顺序表示和实现.cpp"bool Del_Same(SqList &L).原创 2020-09-03 18:59:07 · 4367 阅读 · 2 评论 -
顺序表中删除 s 和 t 之间的元素
问题描述:从有序顺序表中删除值在给定值 s 和 t (s<t)之间的所有元素,如果 s 或 t 不合理或顺序表为空,则显示出错信息并退出程序。思路分析:可以使用k记录需要保存的元素个数,但是这题有一个特点是线性表是有序表,所以删除的元素必定是相连的整体。算法设计思想:先寻找值大于等于 s的第一个元素(第一个要删除的元素),然后寻找值大于 t 的第一个元素(要删除元素的下一个元素),将这段元素删除,后面的元素前移。代码及结果:因为大于 t 的第一个元素最终要挪到大于等于 s...原创 2020-09-03 00:25:48 · 1888 阅读 · 1 评论 -
顺序表中删除指定值时间复杂度为O(n)空间复杂度为O(1)
问题描述:长度为n的线性表,删除表中所有值为x的元素,要求时间复杂度为O(n),空间复杂度为O(1)。算法设计思想:用k记录顺序表中不等于x的元素个数,即需要保存的元素个数,边扫描L边统计k,并将不等于x的元素放在L.data[k]中,最后修改L的长度。代码及结果:#include<stdio.h>#include "线性表的顺序表示和实现.cpp"void Del_x(SqList &L,ElemType x){ //删除顺序表中值为x的数据元素 i..原创 2020-09-02 00:02:04 · 4139 阅读 · 0 评论 -
空间复杂度为O(1)的条件下将顺序表逆置
问题描述:设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。算法基本设计思想: 扫描顺序表L中的前半部分元素,对于元素L.data[i](0<=i<L.length/2),将其与后半部分的对应元素L.data[L.length-i-1]进行交换。【注】这里L.data[L.length-i-1]使用举例子找规律方法得到,例如L.data[0]需要与L.data[L.length-0-1]交换,L.data[1]需要与L.data[L.length-1-1]交换.原创 2020-09-01 23:37:00 · 2039 阅读 · 2 评论 -
删除顺序表中最小值的元素并用最后一个元素填补
问题描述:从顺序表中删除具有最小值的元素(假设唯一)并由函数放回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。算法基本设计思想:搜索整个顺序表,查找最小值元素并记住其位置,搜索结束后用最后一个元素填补空出的原最小值得位置。代码:【注】引用的函数是在 "线性表的顺序表示和实现.cpp"中已经实现了的线性表基本操作,链接如下:https://blog.csdn.net/Dear_Jia/article/details/108297555#include..原创 2020-09-01 00:52:06 · 1988 阅读 · 2 评论 -
线性表在顺序表示下基本操作的实现
此基本操作的实现中使用的是静态分配存储结构#include<stdio.h>/*---------顺序表的动态分配存储结构--------*/ #define List_Init_Size 100 //线性表存储空间的初始分配值#define ListIncrement 10 //线性表存储空间的分配增量typedef int ElemType;typedef struct{ ElemType *elem; //存储空间基址 int length; //线性表当前长度原创 2020-08-29 17:57:57 · 596 阅读 · 0 评论