排序算法总结--ING

# -*- coding:utf-8 -*-

# 排序总结

# 冒泡
def maopao(nums: list) -> list:
    length = nums.__len__()
    for i in range(length):
        for j in range(1, length):
            if nums[j - 1] > nums[j]:
                nums[j - 1], nums[j] = nums[j], nums[j - 1]
    return nums


# 选择
def xuanze(nums: list) -> list:
    length = nums.__len__()
    if length <= 1:
        return nums
    for i in range(length - 1):
        # index_min_num:i
        for j in range(i, length):
            if nums[j] < nums[i]:
                nums[i], nums[j] = nums[j], nums[i]
    return nums


# 插入
def charu(nums: list) -> list:
    length = nums.__len__()
    for i in range(1, length):
        need_insert_num = nums[i]
        # 将nums[i]插入已排序序列nums[1..k-1]
        j = i - 1
        while j >= 0 and nums[j] > need_insert_num:
            nums[j + 1] = nums[j]
            j -= 1
        nums[j + 1] = need_insert_num
    return nums


# 希尔排序
def xier(nums: list) -> list:
    length = nums.__len__()
    gap = 1
    gapc = 3
    while gap < length / gapc:
        gap = gap * gapc + 1
    while gap > 0:
        for i in range(gap, length):
            temp = nums[i]
            j = i - gap
            while j >= 0 and nums[j] > temp:
                nums[j + gap] = nums[j]
                j -= gap
            nums[j + gap] = temp
        gap = gap // gapc
    return nums


# 归并排序
def guibing(nums: list) -> list:
    def merge(left: list, right: list):
        result = []
        while left and right:
            if left[0] <= right[0]:
                result.append(left.pop(0))
            else:
                result.append(right.pop(0))
        result += left + right
        return result

    length = nums.__len__()
    if length < 2:
        return nums
    middle_index = length // 2
    return merge(guibing(nums[:middle_index]), guibing(nums[middle_index:]))


# 快排
def kuaipai(nums: list) -> list:
    length = nums.__len__()
    if length <= 1:
        return nums
    mid = nums[0]
    left, right = [], []
    for i in nums[1:]:
        if i <= mid:
            left.append(i)
        else:
            right.append(i)
    return kuaipai(left) + [mid] + kuaipai(right)


if __name__ == "__main__":
    # import numpy as np
    # nums = np.arange(10)
    # np.random.shuffle(nums)
    # nums = list(nums)

    import random

    nums = list(range(10))
    # random.shuffle(nums)
    # print(f"原始数组: {nums}")

    import time

    sorted_nums = sorted(nums)
    method = [
        ("冒泡排序", "maopao"),
        ("选择排序", "xuanze"),
        ("插入排序", "charu"),
        ("希尔排序", "xier"),
        ("归并排序", "guibing"),
        ("快速排序", "kuaipai"),
    ]

    for i, m in enumerate(method):
        random.shuffle(nums)
        t0 = time.time()
        assert eval(m[1])(nums) == sorted_nums
        print(f"{m[0]}: {time.time()- t0}")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值