一、引入
在文章【数据结构与算法Python描述】——插入排序简介、Python实现以及简单应用中,我们:
- 介绍了一种经典的排序算法——插入排序;
- 使用普通列表作为底层元素存储容器实现了一个游戏高分榜类。
本文将使用相同算法实现对文章【数据结构与算法Python描述】——位置列表简介与Python版手工实现中的位置列表进行排序。
二、实现
为了对位置列表使用插入排序算法,需要定义以下几个变量:
marker
:对于已完成排序的位置列表部分,该变量指向了该部分最右边对象元素所处的位置;pivot
:maker
的右边紧邻位置由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()