6.python实现插入排序和希尔排序

插入排序

"""
插入排序核心思想 将数组分成一个有序数组和一个无序数组 每次从无序数组中提一个元素出来 插入到 有序元素的合适位置
"""
from typing import List


def insert_sort(arr: List) -> List:
    """
     插入排序
    :param arr:
    :return:
    """
    target = []
    l = len(arr)
    for i in range(l):
        insert_index = 0
        for j in range(len(target)):
            if arr[j] >= arr[i]:
                break
            insert_index += 1
        target.insert(insert_index, arr[i])
    return target


def insert_sort_by_org_arr(arr: List) -> List:
    """
    插入排序 原数组上改
    :param arr:
    :return:
    """
    l = len(arr)
    for i in range(l):
        insert_index = i - 1
        insert_val = arr[i]
        while insert_index >= 0 and arr[insert_index] > insert_val:
            arr[insert_index + 1] = arr[insert_index]
            insert_index -= 1
        arr[insert_index + 1] = insert_val


if __name__ == '__main__':
    arr = [4, 1, 5, 7, 6, -1, 55, -55, 666]
    print(insert_sort(arr))
    insert_sort_by_org_arr(arr)
    print(arr)

希尔排序

from typing import List


def shell_sort_by_swap(arr: List) -> List:
    """
    希尔排序是对直接插入排序的改进,直接插入排序的缺点在于如果从小到大排序,但是最小数在很后面,
    这样会造成大量的数据移位操作,希尔排序核心思想将数组平均分成2组之后进行直接插入排序,然后一直分组到最后只能分成一组的时候结束,
    分组的方式是通过步长来进行分组。希尔排序分组的方式使得尽快的让小的数放在前面,大的放在后面,减少移动的次数。
    :param arr:
    :return:
    """
    n = len(arr)

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


if __name__ == '__main__':
    arr = [4, 1, 5, 7, 6, -1, 55, -55, 666]
    shell_sort_by_swap(arr)
    print(arr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值