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 ...
随机推荐
- CenOS 6.5下 mysql自动备份
1.mysql备份命令是mysqldump,自动执行可以用cron,但是文件名需要带有时间标志,shell处理起来很麻烦,我就选择了python来解决 2.文件名用time模块来解决,执行系统命令 ...
- 《计算机程序的构造和解释(第2版)》【PDF】下载
<计算机程序的构造和解释(第2版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382255 内容简介 <计算机程序的构造 ...
- redis基础二
前面已经学习了redis的基本的命令行操作和数据类型,下面开始redis一些有趣的功能. 订阅和发布机制 定义:发布者相当于电台,订阅者相当于客户端,客户端发到频道的消息,将会被推送到所有订阅此频道的 ...
- 【CSS3】透明度opacity与rgba()区别、光标cursor、display、轮廓outline与margin及border区别、em和rem区别
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ansible服务及剧本编写
第1章 ansible软件概念说明 python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack).其功能实现基于SSH远程连接服务:ansi ...
- 数据库的SQL优化
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. (因为在条件查询条件添加索引,会直接被检索到列,会非常的快速) 2.应尽量避免在 wher ...
- Java I/O---File类
1.File概述 File(文件)类可能有一定的误导性,它不仅仅指代的是文件.它既能代表一个特定的文件的名称,又能代表一个目录下的一组文件集的名称,这样就可以用集合List方法调用和遍历.实际上Fil ...
- S7-200和S7-300profibus-DP通信
一.S7-200CN的cup可以通过EM277接入DP网络 二.CPU315-2DP做主站,S7-200CUP做从站 三. 通信题目 四.硬件组态 1.主站的DP组态,地址为2 2.EM277作为从站 ...
- Neo4j学习笔记(1)——使用API编写一个Hello World程序
项目的创建及配置 因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管理. 首先创建一个Maven Project,添加依赖: <dependency> <groupId& ...
- crm踩坑记(三)
React 如何同步更新state 由于setState方法是异步的,而通常很多时候在一个生命周期里更新state后需要在另一个生命周期里使用这个state. 下面介绍几个方法 // 1 this.s ...