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

文章目录

一、引入

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

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

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

二、实现

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

  • marker:对于已完成排序的位置列表部分,该变量指向了该部分最右边对象元素所处的位置;
  • pivotmaker的右边紧邻位置由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)
                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()

猜你喜欢

转载自blog.csdn.net/weixin_37780776/article/details/108457669