基础算法:插入排序和希尔排序

。_饼干妹妹 提交于 2019-12-16 03:30:25

插入排序【Python】

简要描述:插入排序过程类似于打扑克时的 理牌 过程。
过程简单描述:
  • 1:循环,从数组第2个元素开始遍历
  • 1.1:循环,找到插入位置(把它与它位置左边的元素做比较)
  • 1.2:循环,腾出插入位置(保存当前需要插入的元素后,使原本插入位置至当前插入元素位置的前一个元素都往后移动一位)
  • 1.3:插入元素至插入位置
def insert_sort(lst):
    # 循环第r次后,前r+1个元素都是有序的。
    for i in range(1,len(lst)):
        insert_ele = lst[i]
        insert_index = i
        # 1.找到插入的位置
        for j in range(i-1, -1,-1):
            if lst[i] < lst[j]:
                insert_index = j
            else:
                break
        # 2.腾出位置给要插入的元素
        for move in range(i-1,insert_index-1,-1):
            lst[move+1] = lst[move]
        # 3.插入元素
        lst[insert_index] = insert_ele
    return lst


print(insert_sort([0, 5, 2, 1]))

希尔排序【Python】

简要描述:是插入排序的变种,多次分组 + 组内插入排序。
过程简单描述:
  • 1:循环,多次分组。
  • 1.2:循环,在当前分组情况下,对各元素排序。
    各分组都从相对第2个元素开始(gap)元素进行插入排序。
  • 1.2.1:循环,找到插入位置(把它与它位置左边的元素做比较,注意增量为 -gap)
  • 1.2.2:循环,腾出插入位置
  • 1.2.3:插入元素至插入位置
def shell_sort(lst):
    import math
    gap = math.floor(len(lst)/2)
    while gap>=1:
        # 当前分组情况下,对所有组内元素一起插入排序(每个元素在所属组内插入排序)。
        for i in range(gap,len(lst),1):
            insert_item(lst,gap,i)
        gap = math.floor(gap/2)
    return lst

# 各组内排序,增量为gap。组内元素为i-k*gap
def insert_item(lst,gap,i):
    insert_ele = lst[i]
    insert_index = i
    for j in range(i-gap, -gap, -gap):
        if lst[i] < lst[j]:
            insert_index = j
        else:
            break
    for move in range(i - gap, insert_index - gap, -gap):
        lst[move + gap] = lst[move]
    lst[insert_index] = insert_ele

print(shell_sort([0, 5, 2, 1]))

插入排序和希尔排序比较

排序方式/ 性质 时间复杂度 空间复杂度 稳定排序 原地排序
插入排序 O(n2) O(1)
希尔排序 O(nlogn) O(1)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!