快速排序:

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

递归的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算法-快速排序的更多相关文章

  1. Python算法:推导、递归和规约

    Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...

  2. Python与快速排序

    这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出. 注:转载请说明出处 问题提出: 将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, ...

  3. GitHub标星2.6万!Python算法新手入门大全

    今天推荐一个Python学习的干货. 几个印度小哥,在GitHub上建了一个各种Python算法的新手入门大全,现在标星已经超过2.6万.这个项目主要包括两部分内容:一是各种算法的基本原理讲解,二是各 ...

  4. 安装Python算法库

    安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...

  5. python算法(一)

    python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...

  6. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  7. Python算法(含源代码下载)

    关键字:Python Algorithms Python算法  Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...

  8. 《Java算法》排序算法-快速排序

    排序算法-快速排序: /** * 给定一个数组:按照从小到大排序. * 思路: * 1. 获取第一个数放入临时变量data,将大于data的数放右边,小于data的数放在左边. * 2. data左边 ...

  9. python算法题 python123网站单元四题目

    目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来)   下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 ...

随机推荐

  1. Web Scalability for Startup Engineers Tip&Techniques for Scaling You Web Application --读书笔记

    Web Scalability for Startup Engineers Tip&Techniques for Scaling You Web Application 第1章和第2章讲述可伸 ...

  2. 灰度共生矩阵GLCM分析

    纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面性质的纹理概念,可以 ...

  3. Windows server 2003 + IIS6 搭建Asp.net MVC运行环境

    安装.Net Framework4.0.下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=17718 安装WindowsServ ...

  4. functools模块中的函数

    Python自带的functools模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数.换言之,就是能使用该模块对可调用对象进行处理.functools模块函数概览functools.cm ...

  5. plpgsql: 动态插入数据 1

    --目标:1.建立一个函数实现 输入一个表名(tableName)tableName,一个JSON串{feildName1:feildVale1,feildName2:feildVale2} -- 然 ...

  6. (转)UVM挑战及概述

    UVM的调度也具有其独特的挑战,尤其是在调试的领域.其中的一些挑战如下: 1. Phase的管理:objections and synchronization 2. 线程调试 3. Tracing i ...

  7. cacti添加被监控机全过程

    在被监控端上的操作: 1.在被监控机器上root目录下建立文件 test.sh chmod 777 test.sh cat test #!/bin/bash echo $RANDOM 2.在snmpd ...

  8. 【Web应用】JAVA网络上传大文件报500错误

    问题描述 当通过 JAVA 网站上传大文件,会报 500 错误. 问题分析 因为 Azure 的 Java 网站都是基于 IIS 转发的,所以我们需要关注 IIS 的文件上传限制以及 requestT ...

  9. COGS 696. [IOI1996][USACO 2.3] 最长前缀

    ★   输入文件:prefix.in   输出文件:prefix.out   简单对比时间限制:1 s   内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构 ...

  10. Android的Activity之间传对象的方法

    传值代码块 //Serializeable传递对象的方法 public void SerializeMethod(){ Person mPerson = new Person(); mPerson.s ...