zoukankan      html  css  js  c++  java
  • 快速排序方法——python实现

    参考博文:http://www.cnblogs.com/jingmoxukong/p/4302891.html

    快速排序是一种交换排序

    快速排序由C. A. R. Hoare在1962年提出。

    它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数

    它的基本流程是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    算法结构如图所示:

    图中,演示了快速排序的处理过程:

    初始状态为一组无序的数组:2、4、5、1、3。

    经过以上操作步骤后,完成了第一次的排序,得到新的数组:1、2、5、4、3。

    新的数组中,以2为分割点,左边都是比2小的数,右边都是比2大的数。

    因为2已经在数组中找到了合适的位置,所以不用再动。

    2左边的数组只有一个元素1,所以显然不用再排序,位置也被确定。(注:这种情况时,left指针和right指针显然是重合的。因此在代码中,我们可以通过设置判定条件left必须小于right,如果不满足,则不用排序了)。

    而对于2右边的数组5、4、3,设置left指向5,right指向3,开始继续重复图中的一、二、三、四步骤,对新的数组进行排序。

    在此采用python语言实现,代码如下:

    example = [1,3,4,5,2,6,9,7,8,0]
    
    a = 0
    b = len(example)-1
    
    def quickSort(number,head,tail):
    	if (head<tail):
    		base = division(number,head,tail)
    		#print(number[base],"\n")
    		quickSort(number,head,base-1)
    		quickSort(number,base+1,tail)
    	else:
    		print(number)
    
    def division(number,head,tail):
    	base = number[head]
    	while(head<tail):
    		while(head<tail and number[tail]>=base):
    			tail-=1
    		number[head] = number[tail]
    		while (head<tail and  number[head]<=base):
    			head+=1
    		number[tail] = number[head]
    	number[head] = base
    	return head
    
    
    
    if __name__ == '__main__':
    	quickSort(example,a,b)
    

      

    运行结果如下图:

    • 时间复杂度与空间复杂度

    当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。

    而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。

    所以,数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。

    快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 Nlog2N次的分割处理,所以占用空间也是 Nlog2N 个。

  • 相关阅读:
    WSP部署错误—SharePoint管理框架中的对象“SPSolutionLanguagePack Name=0”依赖其他不存在的对象
    Elevate Permissions To Modify User Profile
    Error with Stsadm CommandObject reference not set to an instance of an object
    ASP.NET MVC3添加Controller时没有Scaffolding options
    测试使用Windows Live Writer写日志
    配置TFS 2010出现错误—SQL Server 登录的安全标识符(SID)与某个指定的域或工作组帐户冲突
    使用ADO.NET DbContext Generator出现错误—Unable to locate file
    CSS
    HTML DIV标签
    数据库
  • 原文地址:https://www.cnblogs.com/Hangingter/p/9589427.html
Copyright © 2011-2022 走看看