数据结构及算法之快速排序-python实现
1. 快速排序介绍
快速排序(Quick Sort)使用分治法策略。
它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序流程:
- 从数列中挑出一个基准值。
- 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
- 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。
2. 快速排序的时间复杂度和稳定性
快速排序稳定性
快速排序是不稳定的算法,它不满足稳定算法的定义。
算法稳定性: 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!
快速排序时间复杂度
快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。
3. 实现
class Solution(object): def quick_sort(self, nums): self.partition(nums, 0, len(nums)-1) def partition(self, nums, l, r): # 选区第一个数作为基准 index = l for i in range(l+1, r+1): if nums[i] < nums[index]:# 将小于nums[index]的数放在左边 nums[index], nums[i] = nums[i], nums[index] index = i if index > l: # 递归调用左边 self.partition(nums, l, index-1) if index < r: # 递归调用右边 self.partition(nums, index+1, r) def test_case(): nums = [4, 2, 3, 1, 2, 3, 5, 5, 6] s = Solution() print(nums, end=" ") s.quick_sort(nums) print("->", nums) if __name__ == "__main__": test_case()
# python3 main.py
[4, 2, 3, 1, 2, 3, 5, 5, 6] -> [1, 2, 2, 3, 3, 4, 5, 5, 6]
数据结构及算法之快速排序-python实现相关推荐
- 数据结构与算法之快速排序
数据结构与算法之快速排序 目录 快速排序介绍 代码实现 1. 快速排序介绍 快速排序(Quicksort)是对冒泡排序的一种改进.基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的 ...
- 数据结构与算法学习笔记(python)——第一节 数组应用程序实战
前言 本人是一个长期的数据分析爱好者,最近半年的时间的在网上学习了很多关于python.数据分析.数据挖掘以及项目管理相关的课程和知识,但是在学习的过程中,过于追求课程数量的增长,长时间关注于学习了多 ...
- python 快速排序 详解_数据结构与算法:快速排序(原理讲解+python实现)
快速排序 快速排序是一种基于分治法(Divide and Conquer)的排序算法 它之所以称为快速排序是因为它的平均时间复杂度为O(nlogn),最坏情况下是O(n2) 但是这样的情况不常见 一般 ...
- 在路上---学习篇(一)Python 数据结构和算法 (3) --快速排序
独白: 前几天学的基本简单排序算法,相对来说接受起来还是可以的,今天学的快速排序,视频看了2遍加上自己的思考,才真正的研究明白.自己的编程思维在逐渐的形成,日后还需勤加练习.心得:越高级的算法,越是让 ...
- 【python】数据结构与算法之快速排序(重要)
一.快速排序 设定一个基准值pivot 将数组重新排列,所有比pivot小的放在其前面,比pivot大的放后面,这操作称为分区操作 对两边的数组重复前面两个步骤 二.画图演示 三.代码块 采用递归思想 ...
- python 数据结构与算法 day04 快速排序
1. 快速排序 思路: 快速排序是对原始的序列先找第一个元素应该放在原有序列的哪一个位置,需要有两个游标同时移动,首先从high开始移动,如果high所指的元素比第一个元素大,就继续移动high游标, ...
- 【数据结构与算法】快速排序
目录 一.快速排序定义 二.排序思想 1.Hoare法 2.挖坑法 3.前后指针法 三.不足及改进 1.不足 2.改进 四.由递归改为非递归 一.快速排序定义 快速排序是由东尼·霍尔所发展的一种排序算 ...
- 快速排序伪代码_数据结构和算法之快速排序
快速排序是一种有意思的排序算法.下面我们从核心思想,图解,递推公式,优化和性能度量五个方面讲讲快速排序. 快排的核心思想是这样的 -对于排序数组中下标为p......r之间的一组数据,我们选择p到r的 ...
- 数据结构与算法之一快速排序
快速排序采用的是分治法,何为分治?意思是将原问题分解为若干个规模更小但结构与原问题相似的子问题,递归地解这些子问题(在程序中就是递归调用),然后将这些子问题的解组合为原问题的解. 快速排序的基 ...
最新文章
- 链表问题4——反转双向链表
- android 三维动画效果,9款令人惊叹的HTML5 3D动画应用
- 机器学习——深度学习(Deep Learning)经典资料
- CVPR15 image retrieval reading list
- 物理化学 化学平衡
- CVPR 2019 | 腾讯AI Lab解读六大前沿方向及33篇入选论文
- LeetCode-best time to buy and sell stock 2 数组
- ES6-Object.is() 和Object.assign()
- pgsql 9.4修改数据库只读
- JESD204B 协议解析和参数理解
- Mac上批量修改文件的编码格式
- C语言洛谷P1957口算练习题
- P1_C1-3:系统分析与设计概要
- 小学算术运算测试程序java_Java实现小学四则运算练习系统(UI)
- Excel单元格插入图片,并自适应宽高——保姆级教程
- MTK 轨迹球(JOG_BALL)
- TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
- poj 1830 开关问题
- Android 使用阿里推送服务报错Manifest merger failed
- 用Keil调试STM32F407ZET6时,出现no cortex-m sw device found报错!
热门文章
- Centos R安装
- PaperWeekly 第十一期
- shell脚本 回顾 小练习
- [android] 请求码和结果码的作用
- 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...
- 多域型SSL证书和通配型证书安装指南- iis 6.0 (windows 2003)
- Web 安全与 Rational AppScan 入门
- CHM无法打开解决办法
- 传到虚拟主机在线人数不显示的解决办法
- 敏捷系列情景剧 | 如何“正确”开每日站会