排序算法之快速排序的python实现
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。
快速排序算法的工作原理如下:
1. 从数列中挑出一个元素,称为"基准"(pivot)。
2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
3. 在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
4. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

自我总结:快速排序的步骤就是首先将第一个数作为两边排序的数值,从第二个数开始对第一个数进行比较,如果大于第一个数将这个数放在第一个数的右边,小于放左边,依次进行比较并存放,最后将队列分成三个部分: 左边都比第一个数值小的数,第一个数值,右边都比第一各值大的数。这样就未完成了第一次排序的步骤。第二次是将前半部分的第一个值作为比较的”基数”,同第一次排序进行同样的比较和存放,直到原队列的第一个值之前的那个值。右边和左边做同样的比较,排序,直到之后一个值。这样依次进行递归,直到没有可以在分为左右的,这样就从小到大排序完成。
最优时间复杂度:O(nlogn)
n遍历每个数是O(n),访问每个数是O(logn),最终是O(nlogn)
可以转换为求二叉树深度的思想
最坏时间复杂度:O(n²)
稳定性:不稳定
优点:效率高,数据移动比较少,数据量越大,优势越明显
缺点:不稳定
下面为快速排序的代码实现:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "hsz" # 快排
# first理解为第一个位置的索引,last是最后位置索引
def quick_sort(alist, first, last):
# 递归终止条件
if first >= last:
return # 设置第一个元素为中间值
mid_value = alist[first]
# low指向
low = first
# high
high = last
# 只要low小于high就一直走
while low < high:
# high大于中间值,则进入循环
while low < high and alist[high] >= mid_value:
# high往左走
high -= 1
# 出循环后,说明high小于中间值,low指向该值
alist[low] = alist[high]
# high走完了,让low走
# low小于中间值,则进入循环
while low < high and alist[low] < mid_value:
# low向右走
low += 1
# 出循环后,说明low大于中间值,high指向该值
alist[high] = alist[low]
# 退出整个循环后,low和high相等
# 将中间值放到中间位置
alist[low] = mid_value
# 递归
# 先对左侧快排
quick_sort(alist, first, low - 1)
# 对右侧快排
quick_sort(alist, low + 1, last) if __name__ == '__main__':
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
quick_sort(li, 0, len(li) - 1)
print(li)
排序算法之快速排序的python实现的更多相关文章
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- Python实现排序算法之快速排序
Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...
- Java常见排序算法之快速排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 常用排序算法之——快速排序(C语言+VC6.0平台)
经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) / ...
- Java排序算法之快速排序
Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...
- javascript高级排序算法之快速排序(快排)
javascript高级排序算法之快速排序(快排)我们之前讨论了javascript基本排序算法 冒泡排序 选择排序 插入排序 简单复习: 冒泡排序: 比较相邻的两个元素,如果前一个比后一个大,则交换 ...
- javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...
- 排序算法之快速排序Java实现
排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- 排序算法:快速排序解析及Python实现
关键词:分而治之.递归.计算速度.基准值 1. 什么是分而治之? 1.1 分而治之(divide and conquer)一种递归式方法 1.2 找出基线条件,这种条件必须尽可能简单 1.3 不断将问 ...
随机推荐
- 重载(Overload)和重写(Override)的区别是什么?
首先java程序的运行分为编译和运行两部分. 所以重载和重写在这一点就有很明显的区别,因为重写方法的方法名和参数个数类型都一样,所以在java虚拟机的编译阶段是识别不出重写的方法的不同,在运行期间才可 ...
- ios 软键盘弹出布局被顶上去 已解决
document.body.addEventListener('focusout', () => { //软键盘收起的事件处理 set ...
- crontab定时的使用
//查看所有定时 crontab -l修改$ crontab -e //增加定时 //关闭定时 //删除定时$ crontab -r /sbin/service crond start //启动服务 ...
- 洛谷P1051 谁拿了最多奖学金
https://www.luogu.org/problem/P1051 #include<bits/stdc++.h> using namespace std; struct node { ...
- go语言 实现对称加密解密算法
package main import ( "bytes" "crypto/aes" "crypto/cipher" "crypt ...
- 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(8.21)-- Host Operation with Asymmetric Namespace Access Reporting
8.21 使用ANA报告的主机操作 8.21.1 主机ANA普通操作 主机通过在Identify Controller数据结构中CMIC域的第3位来判断是否支持ANA.NSID或标识(参考第7.10章 ...
- 【网站】i新媒上线了!
[New]i新媒上线了! i新媒,是新媒体人常用和必备的工具导航,我们整合了自媒体平台.行业资讯.运营营销.学习创业等常用的网站,让新媒体人更快地获取有用的知识. 访问链接:https://ixm.h ...
- Dimension reduction
materials: 1. Dimension Reduction - IsoMap
- 执行yum相关命令总是卡住,ctrl+c也退出不了
问题描述 在用yum.rpm命令安装或查询任何包时,执行相关命令后无任何反应,直接卡住,也未给出任何错误提示信息,ctrl+c也不好使,只能杀掉进程. 原因 出现此问题是因为rpm的数据库出现异常了, ...
- mysql之instr函数
1.用于模糊查询,做为过滤条件 ---------------------------上级的新闻下级可以看到-------------------------SELECT a.pk_cms_nrgl_ ...