python希尔排序

参考:www.bilibili.com/video/BV1E4…

实现

import datetime
import random
from functools import wraps

tempList = [random.randint(0, 100000) for x in range(50000)]


def logger(function):
    @wraps(function)
    def wrapper(*args, **kwargs):
        start = datetime.datetime.now().timestamp()
        result = function(*args, **kwargs)
        end = datetime.datetime.now().timestamp()
        print(f"总共花了{int(end - start)}s")
        return result

    return wrapper


@logger
def shellSort(l):
    """
    交换法
    :param l:
    :return:
    """
    gap = len(l) // 2
    # 次数
    while gap != 0:
        # 每组
        for i in range(gap, len(l)):
            # 每组的次数
            for j in range(i - gap, -1, -gap):
                if l[j] > l[j + gap]:
                    l[j], l[j + gap] = l[j + gap], l[j]
        gap //= 2
    return l


@logger
def shellSort2(l):
    """
    位移法
    :param l:
    :return:
    """
    gap = len(l) // 2
    while gap != 0:
        for i in range(gap, len(l)):
            j = i
            temp = l[i]
            if l[j] < l[j - gap]:
                while j - gap >= 0 and temp < l[j - gap]:
                    l[j] = l[j - gap]
                    j -= gap
            l[j] = temp
        gap //= 2
    return l


shellSort2(tempList)