Python的多种风格快速排序案例
来源:互联网 发布:科蒂斯控软件连接 编辑:程序博客网 时间:2024/05/11 12:05
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
#快排详解注释
def quickSort(arr):
less = [] #小的列表pivotList = [] #中心列表
more = [] #大的列表
if len (arr) <= 1: #列表长度不小于等于1
return "sort list len <= 1\n" #小于等于1则报错
else: #列表大于一
pivot = arr[0] #原列表第一个值赋值给 中心值
for i in arr: #把列表循环赋值给i
if i < pivot: #i小于中心值
less.append (i) #把i添加进小的列表里
elif i > pivot: #i大于中间值
more.append (i) #把i添加进大的列表里
else: #i等于中心值
pivotList.append (i) #把i添加进中心列表
less = quickSort (less) #递归小的列表,排序小的列表里面的顺序
more = quickSort (more) #递归大的列表,排序大的列表里面的顺序
return less + pivotList + more #返回三个列表的组合
#简短的快排
def qsort(L):
return (qsort ([y for y in L[1:] if y < L[0]]) +
L[:1] +
qsort ([y for y in L[1:] if y >= L[0]])) if len (L) > 1 else L
#简短的快排易读版
def qsort2(list):if not list:
return []
else:
pivot = list[0]
less = [x for x in list if x < pivot]
more = [x for x in list[1:] if x >= pivot]
return qsort2(less) + [pivot] + qsort2(more)
#其他风格的快排1
from random import *
def qSort(a):
if len (a) <= 1:
return a
else:
q = choice (a)
return qSort ([elem for elem in a if elem < q]) + [q] * a.count (q) + qSort ([elem for elem in a if elem > q])
#其他风格快排2
def quickSort(a):
if len (a) <= 1:
return a
else:
less = []
more = []
pivot = choice (a)
for i in a:
if i < pivot:
less.append (i)
if i > pivot:
more.append (i)
less = quickSort (less)
more = quickSort (more)
return less + [pivot] * a.count (pivot) + more
#该快排指定环境为python 3
def Qsort(array):
if len(array) < 2:
return array
head,*tail = array
less = Qsort([i for i in tail if i < head])
more = Qsort([i for i in tail if i >= head])
return less + [head] + more
#其他风格快排3
def quicksort(array):_quicksort(array, 0, len(array) - 1)
return array
def _quicksort(array, start, stop):
if stop - start > 0:
pivot, left, right = array[start], start, stop
while left <= right:
while array[left] < pivot:
left += 1
while array[right] > pivot:
right -= 1
if left <= right:
array[left], array[right] = array[right], array[left]
left += 1
right -= 1
_quicksort(array, start, right)
_quicksort(array, left, stop)
return 0
#测试代码
a = [4, 65, 2, -31, 0, 99, 83, 782, 1]
# a = quickSort (a)
#a = qsort(a)
#a = qsort2(a)
#a = qSort(a)
#a = quickSort(a)
#a = Qsort(a)
a = quicksort(a)
print (a)
阅读全文
0 0
- Python的多种风格快速排序案例
- 快速排序的多种实现比较
- 快速排序的多种语言代码实现
- 快速排序的多种思路实现
- 快速排序的多种实现(一)
- FP风格以及并发的快速排序
- python的快速排序
- 用 Python 排序数据的多种方法
- 运用Python实现多种排序的方法
- 用 Python 排序数据的多种方法
- 排序算法之快速排序的多种版本
- python 写的快速排序
- 快速排序的python实现
- 多种形式的ListView案例
- Python--排序--快速排序
- [排序] 快速排序(Python)
- Ajax 权衡:XML 的多种风格
- javascript多种风格的网页时间
- linux下mysql5.7.19数据库备份(全量备份、增量备份)
- 设计模式--工厂方法模式
- java 反射
- Program received signal SIGSEGV, Segmentation fault.段错误调试
- 在CentOS上基于Apache http服务搭建git远程仓库(一)
- Python的多种风格快速排序案例
- Java中equals()与hashCode()方法详解
- Caused by: java.lang.RuntimeException: Could not generate DH keypair
- Python3+Django+Mysql配置
- ORACLE数据库使用SYS用户登录出现:ORA-28009:connection as SYS should be as SYSDBA or SYSOPER报错处理办法
- linxu C 学习笔记(三):标准I/O库
- MySQL数据备份之mysqldump使用
- jQuery validate插件submitHandler提交导致死循环解决方法
- 关卡设计快速入门P_4. 放置Actor