数据结构与算法 学习笔记(3):线性表反转与插入排序
本次文章,介绍了线性表中顺序表和链表的反转和插入排序操作。
1.顺序表反转
2.链表反转
3.顺序表插入排序
4.链表插入排序
1.顺序表反转
这个比较简单,就是把前后元素互换,然后第二和倒二元素互换,依次类推
def reverse(self):
elems = self.elements
i, j = 0, len(elems)-1
while i < j:
elem[i], elem[j] = elem[j], elem[i]
i, j = i+1, j-1
2.链表反转
思路:初始化逆序表,每次摘下原表表头,并将表头指针后移,然后用结点current_node存储摘下的结点,放在逆序表表头。将p指向current_node,即逆序表表头。
def rev(self):
p = None
while self.head: #依次摘下所有结点
current_node = self.head
self.head = current_node.next #摘下原来的首结点
current_node.next = p
p = current_node #将摘下的结点加入p引用的结点序列
self.head = p #重置表头链接
3.顺序表的插入排序
思路:两层循环
外循环: 从第二个元素(下标1)开始,用临时变量x存储当前下标对应的elem,方便内循环比较操作,直到表末。
内循环: 如果发现当前的x.elem小于前一位的elem,则将前一位的elem赋值给当前位置的x.elem,然后向前继续判断,如果前二位位置的值大于x.elem,就将其赋值给其后一位,依次类推,直到x.elem小于等于某一位置的elem,退出内循环,将其值插入(赋值)给那个位置。外循环将当前位置后移一位,再进入内循环。
注意:由于外循环从第二位开始,每次都经历了内循环的部分,所以当外循环变量增加到i时,lst[0]到lst[i-1]是已排好序的。
#顺序表的插入排序
def list_sort(lst):
for i in range(1,len(lst)): #外循环
x = lst[i] # 用一个临时变量存储位置i的值
j = i #方便比较操作
while j > 0 and lst[j-1] > x: #当x大于其前面的值时,把前面的值依次向后搬移。
lst[j] = lst[j-1]
j = j-1
lst[j] = x # 最后将 x插入到位置j,完成排序
4.链表插入排序思路主线:
将原始链表分为两个链表,用两个指针P和rem指向链表的表头,每次把p中的元素从左到右依次和rem表的第一个结点比较,如果p.elem<=rem.elem,用q指向p,并把p右移(不能移出链表的尾部),这样q永远在p的前一位,当遇到p.elem>rem.elem时,需要把rem结点从rem所在链表中删除下来,接到q的后面(且在p的前面)。遇到特殊情况,比如rem需要放在表头,此时q为None,则需稍微修改(体现在if语句中)。
#链表插入排序
def sort(self):
p = self.head
if p is None or p.next is None:
return
rem = p.next #定义rem为链表
p.next = None #拆分链表成为两个链表,新表P用来存放排序好的结点,第二个表rem存放未排序好的结点(旧表后面部分)
while rem is not None: #将以rem为表头的链表,一个一个结点推出
p = self.head #令每次循环时,p都始终首先指向新表的表头
q = None #q为p的前一个结点,由于此时p为表头,那么q为None
# 比较p结点元素和rem结点元素的大小,当p<rem,p继续右移,若出现rem表第一个结点比p大时或者p已经移到新表最右边时停止移动p。
while p.elem <= rem.elem and p is not None:
q = p #用q来跟踪P
p = p.next #然后把P向右移,这样的话 q永远在p的前一个结点,方便把rem插入到q和p之间
if q is None: #处理表头插入,比如初始链表元素为2134这样的链表,1需要插入到2的前面,此时的q=None
self.head = rem
else: #不是表头插入的话,正常操作就行
q.next = rem #把rem结点链接到q结点后一位,因为此时q为新表表头
rem = rem.next #1 #把rem表的表头向后一位
q.next.next = p #2 把p结点链接到rem结点后一位,也就是q结点的后两位
#为了避免在“#2”中用两个next,也可以用q指向rem,再用q.next=p,替换“#1、#2”语句,例如:
# q = rem
# rem = rem.next
# q.next = p
代码github链接:https://github.com/LSayhi/Algorithms
微信公众号:AI有点可ai