• 归并排序 / 快排


    这两种排序方法使用了 divided and conquered 的算法思想,我理解为 分--合。两种方法的实现都依赖与递归。

    归并排序

    归并排序图解:

    逐步将列表拆分

    排序后再逐步合并回来

    解题的思想为,将 list 分为左右两个部分,然后对这两部分进行排序。

    代码如下:

    import random
    
    # 归并排序核心代码
    def merge(lst):
        n = len(lst)
        if n < 2:
            return lst
    
    	# 将完整列表分为左右两部分
        mid = n // 2
        left = merge(lst[:mid])
        right = merge(lst[mid:])
    	
    	# 最后将其通过普通的排序算法合并
        return sortlst(left, right)
    
    # 合并两个子部分
    def sortlst(left, right):
    
        res = []
        len_left = len(left)
        len_right = len(right)
        while left and right:
            if left[0] > right[0]:
                res.append(right.pop(0))
            else:
                res.append(left.pop(0))
    
        res.extend(left or right)
    
        return res
    
    lst = list(range(10))
    random.shuffle(lst)
    
    print(merge(lst))
    

    方法中使用到了很多 python list 方法,比如切片、append、extend 等等,不算特别通用,只能说实现了该算法。

    快速排序

    快速排序图解:

    首先,取出列表中第一个位置的数M,然后逐步将其余的数与M做比较,分为左右两部分

    然后再逐步回收

    解题的思想为,将list分为左、list[0]、右三个部分,然后依次合并。

    import random
    
    def quick(lst):
        n = len(lst)
        if n < 2:
            return lst
    
        pivtol = lst[0]
        left = []
        right = []
        for i in lst[1:]:
            if i > pivtol:
                right.append(i)
            else:
                left.append(i)
    
        return quick(left)+[lst[0]]+quick(right)
    
    lst = list(range(10))
    random.shuffle(lst)
    
    print(quick(lst))
    
  • 相关阅读:
    POJ2785-4 Values whose Sum is 0
    Codeforce 9C
    Codeforces 797C -Minimal string
    程序员自我修养
    异或
    Socket网络编程
    java编写本月日历
    PreparedStatement的用法
    项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved 解决方法
    Dell灵越 5559笔记本安装固态硬盘 BIOS设置
  • 原文地址:https://www.cnblogs.com/zx576/p/7105359.html
Copyright © 2020-2023  润新知