python快速排序函数_python算法-快速排序

快速排序:

学习快速排序,要先复习下递归:

递归的2个条件:

1. 函数自己调用自己

2.有一个退出的条件

练习:基于递归下一个函数,计算n!并且求出当n等于10的值。

n!=n * n-1*…..*1

#enconding = utf-8

def func(n):

if n<=1:

return 1

else:

return n*func(n-1)

print func(10)

结果:3628800

快速排序:也是基于递归的思想

核心思想:对于一个数组 12 23 3 4 56 21

快排是从里面随机选择一个数,如21,把所有小于这个数字的排在它的左边,把所有大于它的数排在右边。

用指针指明位置,遍历数组:j-> 0到4

用i表示下标i左边的都是小于21的,包括下标i

初始值 i=-1 -1是针对最小数刚好在最后一位的极端情况

初始值j=0 ,j控制遍历数组的下标。

用j去和21比较,如果大于21,则空过不处理;如果小于21:i要加1,把i和j指向的元素交换位置

手工排序:

i=-1 j=0

取出12,12<21-à i+1=0;i和j指向的元素交换位置,此时i=j=0,都是指向lista[0];j++

12 23 3 4 56 21

i=0,j=1

取出23,21 23>21,空过

12 23 3 4 56 21

i=0 ,j=2

取出3,21, 3<21-> i+1=1;i和j对应元素位置交换,lista[1],lista[2] =

12 3 23 4 56 21

i=1 j=3

取出4<21,i+1=2; i和j对应元素位置交换

12 3 4 23 56 21

i=1;j=4

取出56>21;空过

12 3 4 23 56 21

把下标i+1的元素和最后一个元素交换位置

12 3 4 21 56 23

这样,就完成了第一轮的排序。

为什么要选择最后一个数字呢?

很容易找到。其实选择哪一个最后的结果都是一样的。因此为了简单我们直接就取的最后一个数作为基准数字。

下面,我们来写出12 3 4 以及右子列表56 23快排一次后的结果

左: 3 4 12

右:23 56

快排程序:

1.对于listx调用快排

2.对于listx的左子列表12 3 4进行快排,对于listx的右子列表56 23进行快排

3.直到列表只有一个元素的时候,退出

#enconding = utf-8

def Quick_Sort(lista):

def pathSort(lista,sIndex,eIndex):#第一重排序

flag = lista[eIndex]

i = sIndex - 1

for j in xrange(sIndex,eIndex):

if lista[j]

i+=1

lista[i],lista[j] = lista[j],lista[i]

else:

pass

lista[eIndex],lista[i+1] = lista[i+1],lista[eIndex]

return i+1

def qSort(listb,sIndex,eIndex):

if sIndex >= eIndex: #如果开始位置大于等于起始位置,返回

return

middle = pathSort(listb,sIndex,eIndex)

#递归调用左子列表

qSort(listb,sIndex,middle-1)

#递归调用右子列表

qSort(listb,middle+1,eIndex)

qSort(lista,0,len(lista)-1)

return lista

if __name__ == '__main__':

print Quick_Sort([12,3,4,21,56,23])

变形练习1:修改成从大到小排列。

#enconding = utf-8

def Quick_Sort(lista):

def pathSort(lista,sIndex,eIndex):#第一重排序

flag = lista[eIndex]

i = sIndex - 1

for j in xrange(sIndex,eIndex):

if lista[j]>flag:

i+=1

lista[i],lista[j] = lista[j],lista[i]

else:

pass

lista[eIndex],lista[i+1] = lista[i+1],lista[eIndex]

return i+1

def qSort(listb,sIndex,eIndex):

if sIndex >= eIndex: #如果开始位置大于等于起始位置,返回

return

middle = pathSort(listb,sIndex,eIndex)

#递归调用左子列表

qSort(listb,sIndex,middle-1)

#递归调用右子列表

qSort(listb,middle+1,eIndex)

qSort(lista,0,len(lista)-1)

return lista

if __name__ == '__main__':

print Quick_Sort([12,3,4,21,56,23])

时间复杂度:

第一轮:做完快排后发现基准数是最大的一个,我们比较了n-1次,最后一个

第二轮:n-2次

第三轮:n-3次

第n-1轮:1次

1+2+3….+n-1 = n^2/2

时间复杂度为O(nlogn)

平均情况:

n

第一轮:n-1,排列出2个列表,确定了1个结点的位置

第二轮:n-3,排列出4个列表,确定了3个结点的位置

第三轮:n-7,排列出8个列表,确定了7个结点的位置

第四轮:n-15,排列 出16个列表,确定了15个结点的位置

…..

平均比较次数n-x

2^i-1

总共需要多少轮,才能完成快排?

2^1 + 2^2 +…..2^i-I = n

2*(1-2^i)/1 -2 –I =n

2^(i+1)-2-I =n

i+1 ~ logn

I ~ logn

log(n-x)

最终时间复杂度为 O(nlogn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言课程结束,【计算机】程序设计——C语言基础秋季学期课程圆满结束

2019年10月22日11&#xff1a;40&#xff0c;在同学们发自内心的掌声中&#xff0c;课外培养中心开办的程序设计——C语言基础课程圆满落幕。本次课程由计算机中心的陶媛老师予以指导&#xff0c;在短短五次课的时间里&#xff0c;同学们对学习C语言都有了更深的体悟。对于大部…

struts2获取请求参数的三种方式及传递给JSP参数的方式

接上一篇文章package test;import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import java.util.*; public class HelloAction extends ActionSup…

iOS input被键盘遮挡

//解决第三方软键盘唤起时底部input输入框被遮挡问题var bfscrolltop document.body.scrollTop;//获取软键盘唤起前浏览器滚动部分的高度$("input.inputframe").focus(function(){//在这里‘input.inputframe’是我的底部输入栏的输入框&#xff0c;当它获取焦点时触…

CentOS6.5 搭建Open***服务器

前言&#xff1a;之前搭建过程中找了5-6个教程一起看&#xff0c;真是累&#xff0c;难道就没有写的详细一点&#xff0c;一次成功的吗&#xff0c;基于此花了一下午制作了本教程&#xff0c;实际测试2遍均成功&#xff0c;懒人福音。基础环境&#xff1a;系统&#xff1a;Cent…

python如何在exel中编程_如何使用Python以编程方式将行添加到现有Excel表中

尽管有各种各样的pythonexcel操作库和资源&#xff0c;但我无法找到具体的解决方案。在 现在&#xff0c;我有一个表格存在的Excel模板文件。我想编写一个Python程序来填充这个表。对于任何现有的Excel库都可以这样做吗&#xff1f;模板Excel文件包含一个空表的工作表&#xff…

c语言文件分屏显示,通用子目录文件显示方法

通用子目录文件显示方法在用CHKDS/V对磁盘子目录及子目录文件进行查找时,由于输出显示信息没有分屏显示,很容易错过需要的信息,并且显示信息没有标记出隐藏的子目录名及子目录文件名,这样就对进一步的子目录及文件操作带来许多不便。若辅以管道操作采用CHKDSK/V:|MORE,虽然可分…

hibernate--

正向工程&#xff1a; 通过创建Java代码生成表文件 反向工程&#xff1a; 把表创建完自动生成代码 转载于:https://www.cnblogs.com/Catherinezhilin/p/9687126.html

Javascript、Dom、JQuery

1、Javascript JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。 1.1 存在形式 1 1、文件形式 2 <script src"../jqu…

mysql镜像_Mysql phpmyadmin docker镜像安装

前言1.介于mysql的安装很容易出现各种坑&#xff0c;本文使用 mysql 的docker镜像2.为了方便管理mysql数据库又不暴露mysql服务&#xff0c;所以使用phpmyadmin管理pull镜像#下载mysql镜像docker pull mysql#下载phpmyadmin镜像docker pull phpmyadmin/phpmyadmin创建网络docke…

linux安装lrzsz,并使用rz sz 命令

1 centeos中使用 yum -y install lrzsz 命令下载并安装 2 使用 rz 命令将windows文件上传到linux 3 使用 sz 命令将linux文件下载到windows 例如&#xff1a; 4 tar zcvf dbq.tar.gz files/ 打包指定文件夹 5 sz dbq.tar.gz 转载于:https://www.cnblogs.com/shaner/p/6387516.h…

c语言智能小车项目的感想,智能小车毕业论文(完整版)要点分析.doc

学 士 学 位 论 文系 别&#xff1a; 计算机科学与技术学科专业&#xff1a; 计算机科学与技术姓 名&#xff1a; 2011年 0月智能小车引导控制系统的设计与实现系 别&#xff1a; 计算机科学与技术学科专业&#xff1a;姓 名&#xff1a;2011年 0月智能小车引导控制系统的设计与…

慈不掌兵,义不行贾,烂好人难成大业!

两个月前&#xff0c;朋友的创业公司倒闭了。 朋友是温文尔雅的白面君子&#xff0c;有着光鲜的履历和出众的能力。和他聊天&#xff0c;永远觉得沐浴春风。温润如玉&#xff0c;充满魅力。 朋友细致而体贴。他记得你的生日时&#xff0c;并在那天给发送祝福和红包&#xff1b;…

maven项目构建

Maven是apache的一个开源项目。是一个用来把源代码构建成可发布的构件的工具。 Maven的功能非常强大&#xff0c;可以认为是一个项目管理工具&#xff0c;不仅仅是一个构建工具。 Maven本身的核心很小&#xff0c;但是可以在上面扩展出很多的插件。Mven采用的是插件的思想&…

c++如何打开hdf5文件_如何打开CSV格式文件才能正常使用?

正文开始前先给大家来一波福利&#xff0c;欢迎大家扫码关注后&#xff0c;手动发送“薪酬”领取《企业薪酬管理必备资料包》&#xff01;注意&#xff1a;先扫码关注再回复回复关键词&#xff01;先扫码关注再回复回复关键词&#xff01;先扫码关注再回复回复关键词&#xff0…

Linux驱动技术(四) _异步通知技术

异步通知的全称是"信号驱动的异步IO"&#xff0c;通过"信号"的方式&#xff0c;放期望获取的资源可用时&#xff0c;驱动会主动通知指定的应用程序&#xff0c;和应用层的"信号"相对应&#xff0c;这里使用的是信号"SIGIO"。操作步骤是…

陕理工高级语言程序设计实验 (C)答案,陕理工高级语言程序计实验 (C)模板.doc

陕理工高级语言程序计实验 (C)模板《高级语言程序设计(C)》实验报告目录实验一&#xff1a;C开发环境与顺序结构程序设计21&#xff0e;实验目的&#xff1a;22&#xff0e;实验环境&#xff1a;23&#xff0e;实验步骤&#xff1a;24&#xff0e;实验内容&#xff1a;25&#…

java集合(1)-概述

Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈,队列等,此外Java集合还可以用于保存具有映射关系的关联数组.java集合大致可分为Set,List,Queue和Map四种体系,其中Set代表无序,不可重复的集合;List代表有序,重复的集合;而Map则代表…

UVA1262Password(第K字典序)

题目链接 紫书P323 题意&#xff1a;两个6*5的字母矩阵&#xff0c;两个矩阵每列相同的字母&#xff0c;每列取一个&#xff0c;求按照字典序第k小的序列 分析&#xff1a; 对于第一个样例来说&#xff0c;我们得到{ACDW}、{BOP}、{GMOX}、{AP}、{GSU} 则一共有43423288种密码&…

自定义 View 循环滚动刻度控件

LoopScaleView 先看效果图: enter description hereLoopScaleView 是一个自定义的刻度尺风格的选值控件,从上面的动图大家可以看到 LoopScaleView 的运行效果.可以设置屏幕内显示的刻度数,也可以设置每一个刻度代表的值得大小。 LoopScaleView.class Nested class OnValueChang…

go 类型断言_(57)接口的类型断言

GO提供了一个方法&#xff0c;用来判断接口的底层值是什么类型类型断言 提供了访问接口值底层具体值的方式。t : i.(T)该语句断言接口值 i 保存了具体类型 T&#xff0c;并将其底层类型为 T 的值赋予变量 t。若 i 并未保存 T 类型的值&#xff0c;该语句就会触发一个panic。为了…