Pivot 随机选取意义不大

第一种方法使用随机pivot,使得尽可能平均二分序列,而实际上一般来说需要排序的集合往往是乱序的,无需重新生成随机数作为pivot,大可使用固定位置的数作为pivot,这样便可以适应绝大多数情况,并且简化了逻辑,便有了第二种simple quick Sort。

从运算结果来看不管使用不使用随机pivot,性能几乎一样。

存在大量重复元素时,时间复杂度退化至 O(n2)

在大多教材上说,在输入已经有序等特定情况下,快速排序 (quicksort) 的时间复杂度会退化到 O(n2)。实际上,只要要被排序的对象集合中包括较多的相同元素,大部分教材上的实现都会退化至 O(n2)。大多数实现的partition 实现方法把与 pivot 相等的元素分到 pivot 的同一边是问题所在。

第三种实现quick_sort_quick便是为了解决这个问题的(大量重复元素存在情况下有n*10倍的性能提升)。

====== sort 80*500 numbers ======
quick QS: 2014-11-18 10:08:34.281000
my_quick_sort: 2014-11-18 10:08:35.425000
default sort: 2014-11-18 10:08:36.576000
after sort: 2014-11-18 10:08:36.579000
====== sort 21*300 numbers with many duplicated ======
quick QS: 2014-11-18 10:08:36.579000 37ms #此处可以看出在有大量重复元素的情况下,第三种方法的性能相比另两种提高了一个数量级
my_quick_sort: 2014-11-18 10:08:36.616000 994ms
default sort: 2014-11-18 10:08:37.610000 1ms
after sort: 2014-11-18 10:08:37.611000
====== compare with random or without random ======
simple QS: 2014-11-18 10:08:37.611000
my_quick_sort: 2014-11-18 10:08:38.758000
default sort: 2014-11-18 10:08:39.908000
after sort: 2014-11-18 10:08:39.909000
====== sort 90000 numbers without duplicated ======
qucik QS: 2014-11-18 10:08:39.916000
simple QS: 2014-11-18 10:08:40.285000
my_quick_sort: 2014-11-18 10:08:40.661000
default sort: 2014-11-18 10:08:41.016000
after sort: 2014-11-18 10:08:41.018000
#排序1万个乱序:
simple QS: 2014-11-17 16:53:03.450000 38ms
my_quick_sort: 2014-11-17 16:53:03.488000 35ms
default sort: 2014-11-17 16:53:03.523000
after sort: 2014-11-17 16:53:03.524000
2014-11-17 16:53:03.524000
#排序1万个有序:
simple QS: 2014-11-17 16:53:03.524000 35ms
my_quick_sort: 2014-11-17 16:53:03.559000 35ms
default sort: 2014-11-17 16:53:03.594000
after sort: 2014-11-17 16:53:03.594000 #9万个有序:
simple QS:       2014-11-17 16:57:12.885000 367ms
my_quick_sort: 2014-11-17 16:57:13.252000 352ms
default sort: 2014-11-17 16:57:13.604000 1ms
after sort: 2014-11-17 16:57:13.605000
#-------------------------------------------------------------------------------
# Name: quick sort
# Purpose:
#
# Author: ScottGu<gu.kai.66@gmail.com, 150316990@qq.com>
#
# Created: 04/09/2013
# Copyright: (c) ScottGu<gu.kai.66@gmail.com, 150316990@qq.com> 2013
# Licence: <your licence>
#-------------------------------------------------------------------------------
from datetime import datetime
from random import randint
import sys
sys.setrecursionlimit(10000) def quick_sort(lst):
if len(lst)==0:
return lst
else:
pivot_idx = randint(0, len(lst) - 1)
pivot = lst[pivot_idx]
lesser=quick_sort([val for idx, val in enumerate(lst)
if val <= pivot and idx!=pivot_idx])
greater=quick_sort([x for x in lst if x > pivot])
return lesser+[pivot]+greater def quick_sort_simple(lst):
if len(lst)==0:
return lst
else:
pivot = lst[0]
lesser=quick_sort([x for x in lst[1:] if x <= pivot])
greater=quick_sort([x for x in lst[1:] if x > pivot])
return lesser+[pivot]+greater def quick_sort_quick(lst):
if len(lst)==0:
return lst
else:
pivot = lst[0]
lesser=quick_sort([x for x in lst[1:] if x < pivot])
greater=quick_sort([x for x in lst[1:] if x > pivot])
return lesser+[pivot]+[x for x in lst[1:] if x == pivot]+greater def main(): lst=[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
lst=lst*500
ls2=[1,2,1,1,1,3,4,7,9,11,12,1,1,1,1,1,1,1,1,1,1]
ls2=ls2*300 print '====== sort 80*500 numbers ====== '
print 'quick QS: '+str(datetime.now())
quick_sort_quick(lst)
print 'my_quick_sort: '+str(datetime.now())
quick_sort_simple(lst)
print 'default sort: '+str(datetime.now())
lst.sort()
print 'after sort: '+str(datetime.now()) print '====== sort 21*300 numbers with many duplicated ====== '
print 'quick QS: '+str(datetime.now())
quick_sort_quick(ls2)
print 'my_quick_sort: '+str(datetime.now())
quick_sort_simple(ls2)
print 'default sort: '+str(datetime.now())
ls2.sort()
print 'after sort: '+str(datetime.now()) print '====== compare with random or without random ====== '
print 'simple QS: '+str(datetime.now())
quick_sort_simple(lst)
print 'my_quick_sort: '+str(datetime.now())
quick_sort(lst)
print 'default sort: '+str(datetime.now())
lst.sort()
print 'after sort: '+str(datetime.now()) print '====== sort 90000 numbers without duplicated ====== '
lst=[]
for x in range(90000):
lst.append(x) print 'qucik QS: '+str(datetime.now())
quick_sort_quick(lst)
print 'simple QS: '+str(datetime.now())
quick_sort_simple(lst)
print 'my_quick_sort: '+str(datetime.now())
quick_sort(lst)
print 'default sort: '+str(datetime.now())
lst.sort()
print 'after sort: '+str(datetime.now()) if __name__ == '__main__':
main()

quick sort 的简化实现的更多相关文章

  1. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  2. 1101. Quick Sort (25)

    There is a classical process named partition in the famous quick sort algorithm. In this process we ...

  3. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

  4. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  5. 快速排序(Quick Sort)的C语言实现

    快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤 ...

  6. Quick Sort In-place Implementation

    在线运行PHP http://www.compileonline.com/execute_php_online.php <?php function swap( &$a, &$b ...

  7. 快速排序(Quick Sort)

    快速排序是初学者比较难理解的几个算法之一,这里尽可简单化地讲解,希望能帮到大家. 快速排序基本步骤: 从数列中挑出一个元素,称为"基准"(pivot). 重新排序数列,所有元素比基 ...

  8. 经典排序算法 - 高速排序Quick sort

    经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...

  9. PAT1101:Quick Sort

    1101. Quick Sort (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng There is a ...

随机推荐

  1. CodeBlocks配置文件位置

    CodeBlock配置混乱,决定重装时,删除程序后,需将配置文件删除. 配置文件位置:C:\Users\Administrator\AppData\Roaming\CodeBlocks

  2. 0x7c95caa2指令引用的0x00000000内存 该内存不能read

    出现这样的错误,往往和动态库有关系! 解决方法:

  3. Go语言test之类方法测试

    Go语言提供了完善的单元测试支持,开发人员可以方便的编写测试代码,保证自己代码的质量.在目前的例子中,一般看到都是普通函数的例子.下面我将通过类方法的单元测试例子来展示一下Go语言的魅力. 首先是代码 ...

  4. JCS缓存使用类

    项目是一个门户网站,一些新闻等会做缓存. 导入jar包: 项目跟目录下配置文件:cache.ccf #内存缓存 jcs.default= jcs.default.cacheattributes=org ...

  5. Java 和 C+

    文不对题,啦啦啦~~~ 第一次感到在windows平台java应用发布的无力,平时自己自写自用都是在自己电脑上,没什么感觉.如今要发布个给人用,打包应用.附加jre,这过程还得多加几行字说明,另人特么 ...

  6. angular ng-if scope权限问题

    今天在一个ng-if处理的div中处理一个scope,我一开始想要打印这个选中的值,但是一直打印的是为undefined,找了一会,原来是ng-if这个指令单独开了一个作用域,它只可以继承,不可以进行 ...

  7. .net 下判断中英文字符串长度

    System.Text.Encoding.Default.GetBytes(str).Length

  8. Mybatis3.x与Spring4.x整合(转)

    http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...

  9. java异步式Socket响应数据获取方案

    项目中存在 云中央控制器需要使用多个Socket连接多个云终端控制器的需求. 由于终端数量大,就对整个中央控制器提出了并发的要求,然而获取Socket响应的过程是一个持续阻塞的过程,存在性能风险.而常 ...

  10. ajax异步提交的两种方法

    第一种是原始的ajax,第二种是在jQuery中使用ajax.这是我为测试两种提交方法而写的一段代码. 1.struts.xml <package name="json" e ...