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

    快速排序的介绍

    快速排序(quick sort)的采用了分治的策略。

    • 分治策略指的是:
      将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
    • 快排的基本思想是:
      在序列中找一个划分值,通过一趟排序将未排序的序列排序成 独立的两个部分,其中左边部分序列都比划分值小,右边部分的序列比划分值大,此时划分值的位置已确认,然后再对这两个序列按照同样的方法进行排序,从而达到整个序列都有序的目的。

    先来看一个 我更想称之为伪快排的快排代码

    def quick_sort(array):
        if len(array) < 2:
            return array
        else:
            pivot = array[0]
            less_than_pivot = [x for x in array if x <= pivot]
            more_than_pivot = [x for x in array if x > pivot]
            return quick_sort(less_than_pivot) + [pivot] + quick_sort(more_than_pivot)

    这段代码最关键的是pivot这个参数,这段代码里取序列的第一个元素,然后以这个元素为分组的基准,利用列表解析式使得它左边的值都比它小,右边的值都比它大。然后再分别对这些序列进行递归排序。

    这段代码虽然短小利于理解,但是其效率很低,主要体现在以下方面:

    • 分组基准的选取过于随便,不一定可以取到列表的中间值
    • 空间复杂度大,使用了两个列表解析式,而且每次选取进行比较时需要遍历整个序列。
    • 若序列长度过于小(比如只有几个元素),快排效率就不如插入排序了。
    • 递归影响性能,最好进行优化。
    另一种算法2:
    QuickSort by Alvin
    
    def QuickSort(myList,start,end):
        #判断low是否小于high,如果为false,直接返回
        if start < end:
            i,j = start,end
            #设置基准数
            base = myList[i]
    
            while i < j:
                #如果列表后边的数,比基准数大或相等,则前移一位直到有比基准数小的数出现
                while (i < j) and (myList[j] >= base):
                    j = j - 1
    
                #如找到,则把第j个元素赋值给第个元素i,此时表中i,j个元素相等
                myList[i] = myList[j]
    
                #同样的方式比较前半区
                while (i < j) and (myList[i] <= base):
                    i = i + 1
                myList[j] = myList[i]
            #做完第一轮比较之后,列表被分成了两个半区,并且i=j,需要将这个数设置回base
            myList[i] = base
    
            #递归前后半区
            QuickSort(myList, start, i - 1)
            QuickSort(myList, j + 1, end)
        return myList
    
    
    myList = [49,38,65,97,76,13,27,49]
    print("Quick Sort: ")
    QuickSort(myList,0,len(myList)-1)
    print(myList)
  • 相关阅读:
    谋哥:搞APP,做得累的都不对!
    我在3天内众筹到1.8万的经验分享!
    微价值创始人想要加入“秦王会”啦!
    学习IOS开发UI篇--控制器的管理
    学习IOS开发UI篇--程序启动原理
    学习IOS开问题篇--类中的成员变量如果不实例化是什么情况
    学习IOS开问题篇--IOS程序启动的加载顺序
    学习IOS开问题篇--layoutSubviews什么情况下调用
    学习IOS开发UI篇--UIAlertView/UIActionSheet
    学习IOS开发UI篇--NSNotificationCenter通知中心
  • 原文地址:https://www.cnblogs.com/zknublx/p/11965400.html
Copyright © 2011-2022 走看看