插入排序【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) | 否 | 是 |
来源:CSDN
作者:iamjwe
链接:https://blog.csdn.net/jw2268136570/article/details/103458891