希尔排序

希尔排序

希尔排序算法又叫缩小增量排序算法,是一种更高效的插入排序算法。和普通的插入排序算法相比,希尔排序算法减少移动元素和比较元素大小的次数,从而提高了排序效率。

实现思路:

  1. 将待排序序列划分成多个子序列,使用普通的插入排序算法对每个子序列进行排序。
  2. 按照不同的划分标准,重复执行第一步
  3. 使用普通的插入排序算法对整个序列进行排序
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)  # 每次减小分组的大小,缩小增量

图解步骤:

posted @ 2022-04-18 23:28  黎白昼  阅读(24)  评论(0)    收藏  举报