【数据结构Python描述】位置列表使用插入排序算法

一、引入

在文章【数据结构Python描述】插入排序简介、Python实现以及简单应用中,我们:

  • 介绍了一种经典的排序算法——插入排序;
  • 使用普通列表作为底层元素存储容器实现了一个游戏高分榜类。

本文将使用相同算法实现对文章【数据结构Python描述】位置列表简介与Python版手工实现中的位置列表进行排序。

二、实现

为了对位置列表使用插入排序算法,需要定义以下几个变量:

  • marker:对于已完成排序的位置列表部分,该变量指向了该部分最右边对象元素所处的位置;
  • pivotmarker的右边紧邻位置由pivot指向;
  • walk:如果marker及其左边有某一位置的元素大于pivot指向位置的元素,使用walk变量从marker的位置向左移动。

在这里插入图片描述

import PositionalList


def insertion_sort(L: PositionalList):
    """
    对位置列表L使用插入排序算法,使得每个位置的元素按照非单调递减排序
    :param L: 位置列表实例对象
    :return: None
    """
    if len(L) > 1:  # 否则,无需进行排序
        marker = L.first()  # 将辅助指针变量指向位置列表第一个位置
        while marker != L.last():
            pivot = L.after(marker)  # 尝试对下一个对象元素进行排序
            value = pivot.element()
            if value > marker.element():  # 此时至pivot位置的元素均满足排序要求
                marker = pivot  # 辅助指针变量指向下一个位置
            else:
                walk = marker
                while walk != L.first() and L.before(walk).element() > value:
                    walk = L.before(walk)
                # 至此,要么value应该插入的位置确定下来
                L.delete(pivot)  # 将pivot位置处的元素删除
                L.add_before(walk, value)  # 将对象元素value插入walk指向的位置之前


def main():
    L = PositionalList()
    p1 = L.add_first(22)
    p2 = L.add_last(36)
    p3 = L.add_last(15)
    p4 = L.add_after(p2, 29)
    L.add_before(p1, 29)
    L.add_after(p3, 11)
    L.add_before(p4, 42)
    print(list(L))  # [29, 22, 36, 42, 29, 15, 11]

    insertion_sort(L)
    print(list(L))  # [11, 15, 22, 29, 29, 36, 42]


if __name__ == '__main__':
    main()

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值