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]<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])
变形练习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)
python算法-快速排序的更多相关文章
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- Python与快速排序
这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出. 注:转载请说明出处 问题提出: 将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, ...
- GitHub标星2.6万!Python算法新手入门大全
今天推荐一个Python学习的干货. 几个印度小哥,在GitHub上建了一个各种Python算法的新手入门大全,现在标星已经超过2.6万.这个项目主要包括两部分内容:一是各种算法的基本原理讲解,二是各 ...
- 安装Python算法库
安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...
- python算法(一)
python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- Python算法(含源代码下载)
关键字:Python Algorithms Python算法 Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...
- 《Java算法》排序算法-快速排序
排序算法-快速排序: /** * 给定一个数组:按照从小到大排序. * 思路: * 1. 获取第一个数放入临时变量data,将大于data的数放右边,小于data的数放在左边. * 2. data左边 ...
- python算法题 python123网站单元四题目
目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来) 下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 ...
随机推荐
- 杂谈 什么是伪共享(false sharing)?
问题 (1)什么是 CPU 缓存行? (2)什么是内存屏障? (3)什么是伪共享? (4)如何避免伪共享? CPU缓存架构 CPU 是计算机的心脏,所有运算和程序最终都要由它来执行. 主内存(RAM) ...
- django创建超级用户
终端输入 python3 manage.py createsuperuser 按照提示进行操作即可 不输入用户名会给你默认一个用户名,输入密码是在原处不动的,其实已经在输入了. 创建超级用户是为了能够 ...
- 【javascript】操作给定的二叉树,将其变换为源二叉树的镜像。
操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 ...
- 查找算法(顺序查找、二分法查找、二叉树查找、hash查找)
查找功能是数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. (1)顺 ...
- iOS 通知、本地通知和推送通知有什么区别? APNS机制。
本地/推送通知为不同的需要而设计.本地通知对于iPhone,iPad或iPod来说是本地的.而推送通知——来自于设备外部.它们来自远程服务器——也叫做远程通知——推送给设备上的应用程序(使用APNs) ...
- mac配置android开发环境(一)
MAC配置ADB环境变量 android环境搭建完成之后需要配置android环境变量,这对以后的运行调试很有帮助. 下面我将一下mac环境下的配置步骤: 1.在本地目录(home directory ...
- iOS UITextView placeHolder占位文字的N种方法实现方法
方法一 1.把UITextView的text属性当成“placeholder”使用. 2.在开始编辑的代理方法里清除“placeholder”. 3.在结束编辑的代理方法里根据条件设置“placeho ...
- 【extjs6学习笔记】0.3 准备:系统架构
- SVN提交文件冲突怎么办?
SVN文件遇到冲突怎么解决: 1. 文件出现这个图标提示后,你先把这个文件备份,备份到其他目录. 2. 把SVN目录下的这个文件还原为服务器上的最新版本或者直接删除重新更新到最新版本. 3. 把你备份 ...
- 用YII实现多重查询(基于tag)
场景: 有一个饭店表 restaurant,存放所有饭店记录.我需要一个功能,将饭店按照不同的条件进行多重查询.就象这样: 氛围:浪漫 / 商务会谈 / 茅草屋 菜系:川菜 / 鲁菜 / 家常菜. ...