最值
思想:数组保存线性表L,形成顺序表,标记当前的数据元素,用2个变量表示min,max最小值和最大值,并把他们初始化第一个数据元素,对于从前往后遍历整个线性表
顺序表----------遍历整个顺序表与n同阶无穷大,时间复杂度为O(n)
int min = L[0];
int max = L[0];
1.首先是声明2个变量,保存当前最大值和最小值,并把他们初始化为线性表中第一个元素L[0]
2.使用for循环遍历整个数组
if 语句-- 当前遍历的数组元素与当前保存的最大值和最小值比较,比当前保存的最小值小,或比当前保存的最大值大,就修改当前保存的
3.一直循环直到遍历整个数组
链表-------遍历整个链表
思想:将最小值初始化为第一个节点的数据元素,for循环循环链表,依次指向下一个结点。第一个数据元素节点到最后一个,数据元素进行编写
逆置
思想:申请一个额外的辅助空间与原来的数组大小相同。从尾到头依次遍历原来的数组复制到新数组中 ----空间复杂度O(n)
新的方法:空间复杂度为O(1)的算法,时间复杂度为O(n)
顺序表:
思想:创建2个标记i,j分别表示第一个和最后一个元素位置,兑换数据元素,移动标记直到i=j,对换完成,结束操作,逆置完成
结束条件: 顺序表中有 奇数个元素 i>j
偶数个元素 i=j
但是在代码中都可以用if语句中---i<j ----的条件进行判断
单链表:
思想:单链表中有指向2个指针,一个是指向头结点的头指针p和指向最后一个数据结点尾指针r,将第一个数据结点移动到r所指数据元素结点的后面。不断重复就可以得到逆置的链表
1.r 没有成为第一个数据元素结点,开始循环
2.前2条语句是将第一个数据结点拿出去并保存下来,后2条语句是将保存下来的第一个数据元素结点插入到r所指数据元素结点的后面
有循环的过程,所以时间复杂度为O(n)
理解性记忆:指针赋值过程可以形象地理解为是一个逆时针的圈
归并
归并2个有序的线性表,并且归并之后L依然有序
顺序表
思想:在进行合并之前,需要先申请一个额外空间,保存合并之后的数组,大小size1+size2
借助2个标记,分别是数组1和数组2的i,j。从起始位置开始依次比较2个数组的数据元素,将较小的放进新的数组中
1.初始化(i,j数组1和数组2 k是新的数组的标记)
2.循环对比,以及移动标记
3.将剩下数据元素 依次放到新的数组中 ----时间复杂度O(n)
注意:第三步剩下的数据元素,我们并不知道是哪个数组的,所以还的使用2个while循环来进行判断
时间复杂度为O(n)这里是2个顺序表n+n的和
单链表
思想:将2个线性表保存到单链表中,有2个头结点
循环比较移动指针的过程,当前2个指针所指结点,哪个数据元素小,就指到新的链表中。所有的数据结点都会到新的链表中,剩下的直接转移—修改指针来完成转移
代码解释:循环语句来代表指针移动,和元素对比。循环体中是找出更小的元素结点,将他移动到新的链表中
最后2个if语句判断哪个是剩下的,将他们的指针修改
最后释放没有用的头结点p,q的空间