zoukankan      html  css  js  c++  java
  • 4、快速排序

    4、快速排序

      4.1 分而治之

        快速排序 —— 一种使用D&C(divide and conquer)的排序算法。

        使用D&C解决问题的过程包括两个步骤:

        (1)找出基线条件,这种条件必须尽可能简单。

        (2)不断将问题分解(或者说缩小规模),直到符合基线条件。

        代码清单4-1 求和

    # -*- coding:UTF-8 -*-
    # 使用循环求和
    def sum(arr):
        total = 0
        for x in arr:
            total += x
        return total
    
    # 使用递归求和
    def sum2(arr2):
        if arr2 ==[]:
            return 0
        return arr2[0]+sum(arr2[1:])
    
    
    print sum([2, 4, 6])
    print sum2([2, 4, 6])

        4.2 快速排序

        快速排序是一种常用的排序算法,比选择排序快的多。快速排序也使用了D&C。

        归纳证明是一种证明算法行之有效的方式,它分两步:基线条件和归纳条件。

        快速排序是最快的排序算法之一,也是D&C典范。

        代码清单4-2 快速排序  

    # -*- coding:UTF-8 -*-
    # 快速排序
    
    
    def quicksort(array):
        # 基线条件:为空或只包含一个元素的数组是“有序”的
        if len(array) < 2:
            return array
        # 递归条件
        else:
            pivot = array[0]
        # 由所有小于基准值的元素组成的子数组
        less = [i for i in array[1:] if i <= pivot]
        # 由所有大于基准值的元素组成的子数组
        greater = [i for i in array[1:] if i > pivot]
        return quicksort(less) + [pivot] + quicksort(greater)
    
    
    print quicksort([10, 5, 2, 3])
    # result: [2, 3, 5, 10]

        4.3 合并排序

      合并排序(merge sort),运行时间为,比选择排序快得多,最糟情况运行时间为

       大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因。

  • 相关阅读:
    【bzoj4917】Hash Killer IV 乱搞
    【bzoj2770】YY的Treap 权值线段树
    【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa
    【GXZ的原创】平衡树性能测试
    【bzoj2969】矩形粉刷 期望
    【bzoj3325】[Scoi2013]密码 逆模拟Manacher
    【bzoj4974】字符串大师 逆模拟KMP
    【bzoj4987】Tree 树形背包dp
    【bzoj3672】[Noi2014]购票 斜率优化dp+CDQ分治+树的点分治
    【bzoj4325】NOIP2015 斗地主(&“加强”版) 搜索
  • 原文地址:https://www.cnblogs.com/Lamfai/p/10767384.html
Copyright © 2011-2022 走看看