快速排序方法——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 个。

原文地址:https://www.cnblogs.com/Hangingter/p/9589427.html

时间: 2024-10-12 17:55:55

快速排序方法——python实现的相关文章

快速排序的python多种实现

问题 快速排序,这是一个经典的算法,本文给出几种python的写法,供参考. 特别是python能用一句话实现快速排序. 思路说明 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想 设当前待排序的无

06_私有属性和私有方法-python

私有属性和私有方法 01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法 class Women: def __init__(self, name): self.name = name # 不要问女生的年龄 self.__age

八大排序之快速排序算法-python实现

快排就是折中时间和空间的一个算法,可以说是较为高效的算法,平时用用他没啥大问题. 自己也看到个比较形象生动的例子,为了让大家能够看的比较清楚,我就直接转过来给大家看了哈!但是我使用python实现的: 注意以下除了实现代码,其他为转发,详见页末! 假设我们现在对"6  1  2 7  9  3  4  5 10  8"这个10个数进行排序.首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了).为了方便,就让第一个数6作为基准数

python扩展实现方法--python与c混和编程

Reference: http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html python 头文件在的位置:/usr/include/python2.7                                  /usr/local/include/python2.7 前言(更新:更方便易用的方式在http://www.swig.org/tutorial.html) 大部分的Python的扩展都是用C语言写的,

矩阵或多维数组两种常用实现方法 - python

在python中,实现多维数组或矩阵,有两种常用方法: 内置列表方法和numpy 科学计算包方法. 下面以创建10*10矩阵或多维数组为例,并初始化为0,程序如下: # Method 1: list arr1 = [[0]*10 for i in range(10)] arr1[0][0] = 1 print "Method 1:\n", arr1 arr2 = [[0 for i in range(10)] for i in range(10)] arr2[0][0] = 1 pri

文件处理之复杂,在于内置方法-----python

抛砖引玉: 文件是我们储存信息的地方,我们经常要对文件进行读.写.删除等的操作,在Python中,我们可用Python提供的函数和方法方便地操作文件. ***********************************************文件处理的函数和方法************************************************* 使用Open()函数可打开文件,语法格式如下: f = open(filename,mode,unicoding = "utf-8&q

算法导论 第七章 快速排序(python)

用的最多的排序 平均性能:O(nlogn){随机化nlogn} 原地址排序 稳定性:不稳定 思想:分治 (切分左右) 学习方式:自己在纸上走一遍   def PARTITION(A,p,r): x = A[r] # 锚点 主元{大于它放一边,小于的放另一边} i = p - 1 for j in range(p,r): if A[j] <= x: i += 1 A[i],A[j] = A[j],A[i] A[i+1],A[r] = A[r],A[i+1] return i + 1 def QUI

python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html

前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObject* Module_func()的包装函数 c. 为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组 d. 增加模块初始化函数void initMethod() 3. 编译与测试 a. 创建setup.py b. 通过运行setup.py来编译和连接你的代码 c.

WebDriver中实现对特定的Web区域截图方法--Python实现

一.在自动化测试中,遇到验证码的处理方法有以下两种: 1.找开发去掉验证码或者使用万能验证码 2.使用OCR自动识别 这里,方法一只要和研发沟通就行. 使用pytesseract自动化识别,一般识别率不是太高,处理一般简单验证码还是没问题,例如下面这种验证码: 使用非常简单,只需下面几步: import pytesseract from PIL import Image image=Image.open('new.jpg') vcode=pytesseract.image_to_string(i