1. 插入排序
先来复习一下插入排序,类似于我们打牌时手中的牌,当我们摸一张牌的时候都会将这一张牌按照顺序插入到一个合适的位置。
a = [7,5,9,2,1,8,3]
print('排序前:',a)
for i in range(1,len(a)): # 第i个数(从第二个数开始)
for j in range(i-1,0,-1): # 和i之前的每一个数进行比较
if a[j] < a[j-1]: # 如果第 i 个数 小于i之前的数,交换位置
temp = a[j]
a[j] = a[j-1]
a[j-1] = temp
else:
break
print(a)
print('排序后:',a)
2. 希尔排序
希尔排序也被称为缩小增量排序。可以理解为是插入排序的的一种更高效的实现。
希尔排序思路: 将要排序的列表分成多组子序列,将这些子序列进行排序
1.首先取列表长度整除2(初始每组元素距离gap),并且每个元素之间的距离为gap,然后将这个子序列进行插入排序
2.取第二个元素距离gap,在上一次的gap整除2,然后进行排序
3. 一直重复这个过程,后面的gap都是在上一次的gap的基础上整除2,直到gap等于1
当gap等于4时
当gap等于2时
当gap等于1时
3. 代码实现
def insert_sort(li):
# 初始每组相邻元素之间的距离
gap = len(li) // 2
while gap > 0:
print('gap:', gap)
for i in range(gap, len(li)):
temp = li[i]
j = i - gap
# 各组进行排序
while j >= 0 and temp < li[j]:
li[j + gap] = li[j]
j = j - gap
li[j + gap] = temp
print(li)
# 新相邻元素之间的距离
gap //= 2
a = [7, 8, 4, 6, 1, 5, 9, 2, 3]
print('排序前:', a)
insert_sort(a)
print('排序后:', a)
def shell_sort(a):
n = len(a)
gap = n // 2
while gap > 0:
print('gap:',gap)
for i in range(gap, n):
for j in range(i, gap - 1, -gap):
if a[j] < a[j - gap]:
a[j], a[j - gap] = a[j - gap], a[j]
else:
break
print(a)
gap //= 2
return a
a = [7, 8, 4, 6, 1, 5, 9, 2, 3]
print('排序前:', a)
shell_sort(a)
print('排序后:', a)
def insert_sort_gap(a, gap):
for i in range(gap, len(a)):
temp = a[i]
j = i - gap
while j >= 0 and temp < a[j]:
a[j + gap] = a[j]
j = j - gap
a[j + gap] = temp
print(a)
def shell_sort(a):
d = len(a) // 2
while d >= 1:
print('\ngap:', d)
insert_sort_gap(a, d)
d //= 2
print(a)
a = [7, 8, 4, 6, 1, 5, 9, 2, 3]
print('排序前:', a)
shell_sort(a)
print('排序后:', a)