python实现快速排序
最近在公司的工作内容发生变化,短期内工作量变少了,这也让我有时间整理一些日常学习和工作中的收获或思路。所以申请了博客,并打算持续更新。
快速排序采用了分治的思想,基本思想是选取数组中一个数为基准数(一般选择数组中的第一个数),一次排序过程中,将比基准数小的都放在它左侧,比基准数大的放在它的右侧。经过这次排序后得到两个数组和一个基准数,数组1中全部元素小于基准数,数组2中的全部元素大于基准数,然后对数组1,2分别进行同样的排序(递归),最后直到剩下一个数字。
下面给出python代码实现
def partiton(li, low, high):
key = li[low]
while low < high:
while low < high and li[high] >= key:
high -= 1
if low < high:
li[low], li[high] = li[high], li[low] while low < high and li[low] < key:
low += 1
if low < high:
li[high], li[low] = li[low], li[high] return low def quickSort(li, low, high):
if low >= high:
return
center = partiton(li, low, high)
quickSort(li, low, center - 1)
quickSort(li, center + 1, high)
关于实现:
快速排序的实现有很多种,这里我给出了比较常规并且好理解的一种.低位,高位两个指针从左右两侧相向遍历list。当高位指针发现了小于基准数的元素时,便停止移动,此时开始移动低位指针,当低位指针发现了大于基准数的元素时,便停止移动,两指针交换元素值,如此循环,直至两指针相遇。
关于时间复杂度:
快速排序具体的运行时间和原始列表本身的排序状态有很大关系,理论上快排的时间复杂度是(nlogn),但是如果运气不好糟糕,比如说初始列表是[5,4,3,2,1],那么根据上面的方法实现过程是什么样的呢,实现过程如下:
[5,4,3,2,1] -> [4,3,2,1,5] -> [3,2,1,4,5] -> [2,1,3,4,5] -> [1,2,3,4,5]
这样的排序实现过程很眼熟,跟最简单的冒泡排序的实现过程是完全相同的,所以说快排的最坏情况是冒泡排序,时间复杂度是(n2)
以上的实现较为通用,如果不使用python,而使用c++,java等其它编程语言实现,代码结构不会相差太多。我想到了一种比较贴合python语法特点,并且能较好的展示快排思想的实现方法。不同点是该方法时间在层递归中需要遍历2次列表,即复杂度为(2nlogn)
def qsort(lst):
if not lst:
return []
return qsort([i for i in lst[1:] if i < lst[0]]) + [lst[0]] + qsort([i for i in lst[1:] if i > lst[0]])
python实现快速排序的更多相关文章
- Python与快速排序
这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出. 注:转载请说明出处 问题提出: 将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, ...
- python 实现快速排序
一.快排思想 快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数), 分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数, i- ...
- Python实现快速排序--数据结构
快速排序(Quick Sort) 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个元素要O(nlogn)次比较.在最坏状况下则需要O(n^2)次比较,但这种状况并不常见.事实上,快速 ...
- python实现快速排序算法
快速排序算法又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, 排序n个项目要O(nlogn)次比较.在最坏状况下则需要O(n*2) ...
- $用python实现快速排序算法
本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁. 1. 三言两语概括算法核心思想 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来 ...
- 【python】快速排序
快速排序思想和C++的差不多,主要是通过写排序对python的语法更加了解. # 快速排序 def qsort(arr, left, right): if left >= right: retu ...
- python 实现快速排序和插入排序
def quick_sort(data): if len(data)<2 or (len(data)==2 and data[0]<=data[1]): #[2,3]此情况会死循环 所以加 ...
- python之快速排序
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- Python 双向链表 快速排序
1.创建链表: from random import randint class DLinkedNode(object): def __init__(self, data=None, pre=None ...
随机推荐
- 【ANT】使用ANT自动执行JMeter用例
1.把\apache-jmeter-3.1\extras目录下的build.xml和jmeter-results-detail-report_21.xsl两个文件拷贝到用例所在目录: 2.修改用例名称 ...
- OC学习15——文件I/O体系
OC提供了丰富的I/O相关API,如果只是管理文件和目录,程序可以使用NSFileManager进行管理,包括创建.删除.移动和复制文件等:如果程序需要读取文件内容,则可通过NSFileHandle进 ...
- iOS开发富文本制作 图片和文字/NSMutableParagraphStyle/NSMutableAttributedString
/NSMutableParagraphStyle/NSMutableAttributedString 组合使 NSString * titlestr=@"日产GT-R"; NSMu ...
- bzoj 3991: [SDOI2015]寻宝游戏
Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...
- 模板引擎(smarty)知识点总结三
阔别了几个月,小杨又来分享php知识.话不多说,言归正传,今天继续带来smarty的知识点. -----------------smarty assign append 详解 对于这两个的区别和联系 ...
- javascript01
手敲代码01 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- Java 浮点型与双精度数值比较
对于双精度与浮点数之间的比较存在潜在的转化
- Mysql 索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- 一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)
本文脉络图如下: 1.CLR(Common Language Runtime)公共语言运行时简介 (1).公共语言运行时是一种可由多种编程语言一起使用的"运行时". (2).CLR ...
- Git_学习_03_ ignore文件配置
一.示例 # 1.Compiled class file *.class bin target # 2.Log file *.log logs # 3. Package Files # *.war * ...