插入排序:直接插入排序和希尔排序

2021-04-15  本文已影响0人  星光下的胖子

一、原理

二、代码实现

题目:随机给定一个数组,按从小到大排序。

逻辑代码:
from time import time
import numpy as np


# 直接插入排序
def straight_insertion_sort(arr):
    # 依次遍历unsorted_list列表中的元素,索引位置从1开始
    for i in range(1, len(arr)):
        value = arr[i]  # 获取a元素
        index = i - 1  # sorted_list列表中最后一个元素b的索引位置

        # 将a元素依次与sorted_list中的元素b从后向前比较
        # 目的:将a元素插入sorted_list列表中的正确排序位置上
        while index >= 0 and arr[index] > value:
            arr[index + 1] = arr[index]  # 满足条件,sorted_list中的b元素右移一格
            index -= 1
        arr[index + 1] = value  # 元素a填入sorted_list中的索引空位


# 希尔排序
def shell_sort(arr):
    n = len(arr)
    gap = int(n / 2)
    while gap > 0:
        # 按gap分组,并对每组进行“直接插入排序”操作
        for i in range(gap, n):
            value = arr[i]
            index = i - gap
            while index >= 0 and arr[index] > value:
                arr[index + gap] = arr[index]
                index -= gap
            arr[index + gap] = value

        # 增量gap减半
        gap = int(gap / 2)


if __name__ == "__main__":
    # 直接插入排序
    np.random.seed(10)
    array = list(np.random.randint(0, 1000, size=(2000,)))
    start = time()
    straight_insertion_sort(array)
    end = time()
    print(f"straight_insertion_sort()函数耗时{end - start}秒")
    print(array[:100])

    # 希尔排序
    np.random.seed(10)
    array = list(np.random.randint(0, 1000, size=(2000,)))
    start = time()
    shell_sort(array)
    end = time()
    print(f"shell_sort()函数耗时{end - start}秒")
    print(array[:100])
运行结果如下,\frac{t_{直接插入排序}}{t_{希尔排序}} \approx 30(倍)
上一篇下一篇

猜你喜欢

热点阅读