数据结构与算法 学习笔记(3)- 表反转与插入排序

数据结构与算法 学习笔记(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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值