快速排序:

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

递归的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)

python快速排序函数_python算法-快速排序相关推荐

  1. python快速排序代码_Python实现快速排序算法

    原标题:Python实现快速排序算法 Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通 ...

  2. Java排序算快速排序_Java排序算法 [快速排序]

    package cn.com.dom4j.sort; public class QuickSort { /** 快速排序 在 Java中, 快速排序被用作基本数据类型的排序 (当然, 不只快速排序一种 ...

  3. python filter函数_python基础——filter函数

    python基础--filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  4. python not函数_python 函数

    1 为什么使用函数 在没有接触函数时,有时候需要将一个功能多次写,如果需要修改其中一个变量,则需要把所有实现该功能的代码一处一处改.不利于代码维护,代码量大了,组织结构也会很不清晰. 所以总结不使用函 ...

  5. python include函数_python 库函数

    python的内建函数和库函数的区别是什么? [区别]:标准库函数都需要import xxx才能取得.内建函数都在__builtins__里面,在global里直接就能用. [补充]:1.python ...

  6. python islower函数_python字符串是否是小写-python 字符串小写-python islower函数-python islower函数未定义-嗨客网...

    Python字符串是否是小写教程 在开发过程中,有时候我们需要判断一个 Python islower()函数详解 语法 str.islower() -> bool 参数 参数 描述 str 表示 ...

  7. python agg函数_Python Pandas Series.agg()用法及代码示例

    Python是进行数据分析的一种出色语言,主要是因为以数据为中心的python软件包具有奇妙的生态系统. Pandas是其中的一种,使导入和分析数据更加容易. Pandas Series.agg()用 ...

  8. python findall函数_python正则表达式之中的findall函数是什么?

    在这篇文章之中我们来了解一下关于python正则表达式的相关知识,有些朋友可能是刚刚接触到python这一编程语言,对这一方面不是特别的了解,在接下来这篇文章将会来带大家来了解关于正则表达式中的pyt ...

  9. python log函数_Python log10() 函数

    Python log10() 函数 描述 log10() 方法返回以10为基数的x对数. 语法 以下是 log10() 方法的语法:import math math.log10( x ) 注意:log ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装CHM阅读器KchmViewer 5.3
  2. 向sdcard中添加文件遇到的一些问题
  3. 操作系统(Linux与Windows)的进程管理
  4. 【C++提高班】c++数组遍历比较相邻的数值
  5. CentOS 7文件系统与日志分析详解
  6. 通过NodeJS自动生成的MySQL的REST风格API
  7. Linux内核分析 - 网络[八补]:IP协议补充
  8. websocket中发生数据丢失_node.js – Websocket传输可靠性(重新连接期间Socket.io数据丢失)...
  9. 用C读取INI配置文件 (可在linux平台上用)
  10. 配置IIS服务器,支持sis下载
  11. Json 入门例子【3】
  12. 51cto案例精解第一章PPT
  13. mysql like in 组合_mysql like in 组合 黄小柔junior分手原因
  14. linux 进程学习
  15. 各种ActiveX控件下载地址分享
  16. Symbian中的iScanCode和iCode(转)
  17. [论文解读] Bridging Machine Learning and Logical Reasoning by Abductive Learning
  18. 【javase基础】第六篇:方法的重载与递归
  19. 【安装填坑】-import win32api, sys, os ImportError: DLL load failed: 找不到指定的模块。
  20. OGG基本框架、安装、运维、报错处理、监控命令

热门文章

  1. 10个关于linux中Squid代理服务器的实用面试问答
  2. Linux内存分配机制之伙伴系统和SLAB
  3. 爬山算法和模拟退火算法简介(转)
  4. 第6章 服务模式 Service Interface(服务接口)
  5. 谁优谁劣?——AMD与Intel产品对比分析
  6. gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression)
  7. 谷歌 colab_如何在Google Colab上使用熊猫分析
  8. 1893. 检查是否区域内所有整数都被覆盖
  9. express 路由中间件_Express通过示例进行解释-安装,路由,中间件等
  10. css grid布局_如何使用CSS Grid重新创建Medium的文章布局