• 归并排序 / 快排


    这两种排序方法使用了 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))
    
  • 相关阅读:
    。net文件缓存 枫
    C#实现冒泡排序 堆栈 队列 枫
    Android程序开发初级教程(三) 枫
    c#语法片段总结 枫
    Eclipse快捷键大全(转载) 枫
    asp.net页面缓存技术(Cache、XML) 枫
    android案例 枫
    DIV CSS兼容性解决IE6/IE7/FF浏览器的通用方法完美兼容 枫
    List<>.Contains<>的用法 枫
    sql 获取表结构信息(2005) 枫
  • 原文地址:https://www.cnblogs.com/zx576/p/7105359.html
Copyright © 2020-2023  润新知