python-分治法排序

1. 快速排序

"""
快速排序:
    使用递归的方式,将待排序的序列通过分界值分割成两个部分,
    其中一份的所有数据都比分界值小,两一部分的数据比分界值大
"""

def quick(my_list, start, end):
    # 如果start >= end, 程序结束, 说明排好顺序了
    if start >= end:
        return      # 结束递归, 即: 排序成功
    # 定义变量 left 和 right, 分别表示: 起始 和 结束索引
    left = start
    right = end
    # 定义变量 middle(mid), 表示: 分界值, 假设: 列表的第1个元素为: 分界值
    mid = my_list[start]
    # 具体的排序过程, 只要 left < right, 就说明没有找完, 就一直找
    while left < right:
        # 把 分界值右边 比分界值小的数据 放到 分界值的左边
        # 如果 right位置的值 比 分界值大, right 就 -= 1
        while my_list[right] >= mid and left < right:
            right -= 1
        # 走到这里, 说明, right索引的值 比分界值 小, 就赋值即可, 即: 把该值放到分界值的左边
        my_list[left] = my_list[right]
        # 把 分界值左边 比分界值大的数据 放到 分界值的右边
        # 如果 left位置的值 比 分界值小, left 就 += 1
        while my_list[left] < mid and left < right:
            left += 1
        # 走到这里, 说明, left索引的值 比分界值 大, 就赋值即可, 即: 把该值放到分界值的右边
        my_list[right] = my_list[left]
    # 走到这里, 说明 left >= right, 即: left索引的位置, 就是: 分界值的位置
    my_list[left] = mid
    # 走到这里, 说明本轮分界值位置都已锁定, 递归继续往下继续: 分别对分界值左边 和 分界值右边的数据, 做重复操作即可
    # 分界值左边的数据, 继续排序
    quick(my_list, start, left - 1)
    # 分界值右边的数据, 继续排序
    quick(my_list, right + 1, end)


def quickSort(data_list):
    if len(data_list) <= 1:
        return
    quick(data_list, 0, len(data_list) - 1)

if __name__ == '__main__':

    data_list = [7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
    print(f"排序前的顺序:{data_list}")
    quickSort(data_list)
    print(f"排序后的顺序:{data_list}")

控制台输出

排序前的顺序:[7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
排序后的顺序:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2. 归并排序

"""
归并排序:
    使用递归的方式将待排序的序列分割成两个只有一个元素的部分,
    然后分别按顺序对比两个部分中的元素,将其归并为一个有序的序列
"""

def merge(left, right):
    # 记录下标
    r, l = 0, 0
    # 定义有序列表
    temp = []
    # 循环归并
    while l < len(left) and r < len(right):
        # 若左边列表中的数更小
        if left[l] <= right[r]:
            # 将较小数放在有序列表中
            temp.append(left[l])
            l += 1
        # 若右边列表的数更小
        else:
            # 将较小数放在有序列表中
            temp.append(right[r])
            r += 1
    # 处理多余的数据
    temp += left[l:]
    temp += right[r:]
    return temp

def mergerSort(data_list):
    # 若只有一个数 结束递归
    if len(data_list) <= 1:
        return data_list
    # 将带排序的数据分成两部分
    num = len(data_list) // 2
    # 左边部分
    left = mergerSort(data_list[:num])
    # 右边部分
    right = mergerSort(data_list[num:])
    # 递归处理
    return merge(left, right)


if __name__ == '__main__':

    data_list = [7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
    print(f"排序前的顺序:{data_list}")
    data_list = mergerSort(data_list)
    print(f"排序后的顺序:{data_list}")

控制台输出

排序前的顺序:[7, 4, 8, 5, 2, 0, 1, 9, 3, 6]
排序后的顺序:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值