zoukankan      html  css  js  c++  java
  • 归并排序 / 快排

    这两种排序方法使用了 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))
    
  • 相关阅读:
    公钥,私钥和数字签名这样最好理解
    SolrCloud的官方配置方式
    由于Windows和Linux行尾标识引起脚本无法运行的解决
    python模块名和文件名冲突解决
    Linux下编译安装python3
    Storm集群的安装配置
    Linux下编译安装Apache 2.4
    SELinux的关闭与开启
    Spring MVC配置静态资源的正常访问
    SolrCloud环境配置
  • 原文地址:https://www.cnblogs.com/zx576/p/7105359.html
Copyright © 2011-2022 走看看