希尔排序
希尔排序
希尔排序算法又叫缩小增量排序算法,是一种更高效的插入排序算法。和普通的插入排序算法相比,希尔排序算法减少移动元素和比较元素大小的次数,从而提高了排序效率。
实现思路:
- 将待排序序列划分成多个子序列,使用普通的插入排序算法对每个子序列进行排序。
- 按照不同的划分标准,重复执行第一步
- 使用普通的插入排序算法对整个序列进行排序
print("插入排序".center(20,"*"))
# 插入排序
arr = [4, 5, 90, 65, 43, 78, 34, 55, 66, 1, 2]
# 思想 从小到大
# 从第一个元素开始,假设前面的元素都是有序的
# 拿当前元素与前面的每个元素进行比较
# 如果当前元素小于前面的某个元素,前面的某个元素就往后移动一位
# 如果当前元素大与前面的某个元素,就把当前元素放到某个元素的后面
# 一直重复上述操作
# 直到所有的元素循环一遍
# 时间复杂度:11*1+10*2+9*3+8*4+(n*n))=n^2=O(n^2)
for i in range(1, len(arr), 1): # 循环每个元素
currentNum = arr[i] # 保存当前元素的值
j = i # j 表示是前面的元素
while j > 0 and currentNum < arr[j - 1]: # 如果前面的每个元素都比较完,或者当前元素小于前面的某个元素
arr[j] = arr[j - 1] # 前面的元素后移动一位
j -= 1 # 依次与前面的每个元素比较
else: # 如果当前元素比前面的元素大
arr[j] = currentNum # 当前元素就放在前面元素的后面
print(arr) # 每一轮比较后的结果
print("希尔排序".center(20,"*"))
# 希尔排序 从小到大
# 缩小增量排序
# 把序列分成若干份
# 对每份进行插入排序
# 重复:把序列分成若干份,对每份进行插入排序
# 直到每份的大小为1
# 进行最后一次插入排序
# 时间复杂度:O(n^2)
arr = [4, 5, 90, 65, 43, 78, 34, 55, 66, 1, 2]
k = int(len(arr) / 2) # 每次对序列所分组的大小
while True: # 进行缩小增量的循环
# 进行分组后的插入排序
for i in range(k, len(arr), 1): # 开始遍历序列,从k开始,以k的大小进行分组,假设前面的元素是有序的
currentNum = arr[i]
j = i
while j > k - 1 and currentNum < arr[j - k]: # 当前元素小于前面的某个元素
arr[j] = arr[j - k] # 某个元素往后移动k位
j -= k # 依次与前面的每个元素进行比较
else: # 当前元素大于前面的某个元素
arr[j] = currentNum # 把当前元素放在某个元素的后面
print(arr) # 每轮排序的结果
if k == 1: # k=1 说明已经进行了最后一轮的排序
break
k = int(k / 2) # 每次减小分组的大小,缩小增量
图解步骤:


浙公网安备 33010602011771号