04-十大排序算法-希尔排序-Python实现

算法排序 【希尔排序】

时间作者版本内容备注
2023/08/03henry_oulen@163.comv1.0算法排序-希尔排序

1.希尔排序介绍

基本思想:希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。

算法实现:希尔排序需要定义一个增量,这里选择增量为gap=length/2,缩小增量以gap=gap/2的方式,这个增量可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列,这个增量是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。

(1)对于一个无序序列{8,9,1,7,2,3,5,4,6,0}来说,我们初始增量为gap=length/2=5,所以这个序列要被分为5组,分别是{8,3},{9,5},{1,4},{7,6},{2,0},对这5组分别进行直接插入排序,则小的元素就被调换到了前面,然后再缩小增量gap=gap/2=2。

img

(2)上面缩小完增量后,序列再次被分为2组,分别是{3,1,0,9,7}和{5,6,8,4,2},再对这两组进行直接插入排序,那么序列就更加有序了。

img

(3)然后再缩小增量gap=gap/2=1,这时整个序列就被分为一组即{0,2,1,4,3,5,7,6,9,8},最后再进行调整,就得到了有序序列{0,1,2,3,4,5,6,7,8,9}。
img

2.代码实现-Python

#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: henry_oulen@163.com
@file: 04-希尔排序.py
@time: 2023/8/4 13:28
@desc: 
"""

import random
import time


def func_time(func):
    def innrer(*args, **kwargs):
        start_time = time.time()
        result = func(*args, *kwargs)
        end_time = time.time()
        print('函数运行时间为:', end_time - start_time, 's')
        return result

    return innrer




@func_time
def main(arr: list):
    """
    :param arr: 需要排序的列表 长度大于1
    :return:
    """
    print(arr)
    if len(arr) <= 1:
        return arr
    n = len(arr)

    num = n // 2

    while num > 0:
        for i in range(num, n):
            j = i
            while j >= num:
                if arr[j - num] > arr[j]:
                    arr[j], arr[j - num] = arr[j - num], arr[j]
                j -= num
        num = num // 2

    return arr


if __name__ == '__main__':
    arr = [random.randint(0, 10000) for i in range(10)]
    print("排序前列表:", arr)
    arr = main(arr)
    print("排序后列表:", arr)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值