快速排序总结,Python版
快速排序是面试最常考内容,
让你描述算法,
让你写算法,
让你分析时间复杂度
#快速排序整理'''九章算法令狐冲老师排序思路:
先取到中心index对应的数组值
循环从左边找到第一个比中间值大的数字
循环从右边找到第一个比中间值小的数字
然后交换这两个数字
最后分别对左右两个部分重复以上思路'''def quickSort(arr):if not arr:return return qsort(arr, 0, len(arr)- 1)def qsort(arr, start, end):if start >= end:return left, right = start, end #start和end固定,以后只需要不停改变left和right的值就行了#注意1:拿到中间指针对应的数组值,而不是拿到中间指针的值pivot = arr[(left + right)//2] #注意2: left <= right 而不是 left < rightwhile left <= right:#注意3:arr[left] < pivot 而不是while left <= right and arr[left] < pivot:left += 1while left <= right and arr[right] > pivot:right -= 1if left <= right:arr[left], arr[right] = arr[right], arr[left] #交换left和right对应的值left += 1right -= 1print('left and right is :',left, right)#注意4:经过上面的交换,这里关系变为了right < leftqsort(arr, start, right)qsort(arr, left, end)#return arra = [9,3,8,5]
b = quickSort(a)
print("sequence is:", b)输出
left and right is : 1 0
left and right is : 3 1
sequence is: [3, 5, 8, 9]
[Finished in 0.0s]'''
复杂度分析:
当第一刀刚好切在左边,刚好导致左边只有一个数字,其他数字全部在右边,这种情况复杂度最差达到n的平方
当第一刀切在中间,并且左右两侧均匀分布,这种情况最优,复杂度达到nlogn'''这道题有四个注意点,要不然很容易出错。
网页测试代码
class Solution:# @param {int[]} A an integer array# @return nothingdef sortIntegers2(self, A):# Write your code hereself.quickSort(A, 0, len(A) - 1)def quickSort(self, A, start, end):if start >= end:returnleft, right = start, end #start和end固定,以后只需要不停改变left和right的值就行了#注意1:拿到中间指针对应的数组值,而不是拿到中间指针的值# key point 1: pivot is the value, not the indexpivot = A[(start + end) // 2];#注意2: left <= right 而不是 left < right# key point 2: every time you compare left & right, it should be # left <= right not left < rightwhile left <= right:#注意3:A[left] < pivot 而不是<=while left <= right and A[left] < pivot:left += 1while left <= right and A[right] > pivot:right -= 1if left <= right:A[left], A[right] = A[right], A[left]left += 1right -= 1#注意4:经过上面的交换,这里关系变为了right < leftself.quickSort(A, start, right)self.quickSort(A, left, end)
通过了
下面是其他人的思路,总体一样
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
1 从数列中挑出一个元素,称为 "基准"(pivot),
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
下面也是别人整理的,可以参考
1)n大时好,快速排序比较占用内存,内存随n的增大而增大,但却是效率高不稳定的排序算法。(2)划分之后一边是一个,一边是n-1个,这种极端情况的时间复杂度就是O(n2)(3)最好的情况是每次都能均匀的划分序列,O(nlog2n)(4)快速排序空间复杂度只是在通常情况下才为O(log2n),如果是最坏情况的话,很显然就要O(n)的空间了。当然,可以通过随机化选择pivot来将空间复杂度降低到O(log2n)。
下面还是别人的
下面的算法就是把第一刀切在了最左边的位置
'''
六、快速排序 QuickSort
介绍:
快速排序通常明显比同为Ο(n log n)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可见掌握快排的重要性。
步骤:
1.从数列中挑出一个元素作为基准数。
2.分区过程,将比基准数大的放到右边,小于或等于它的数都放到左边。
3.再对左右区间递归执行第二步,直至各区间只有一个数。
'''def quick_sort(ary):return qsort(ary,0,len(ary)-1)def qsort(ary,left,right):#快排函数,ary为待排序数组,left为待排序的左边界,right为右边界if left >= right : return arykey = ary[left] #取最左边的为基准数lp = left #左指针rp = right #右指针while lp < rp :while ary[rp] >= key and lp < rp :rp -= 1while ary[lp] <= key and lp < rp :lp += 1ary[lp],ary[rp] = ary[rp],ary[lp]ary[left],ary[lp] = ary[lp],ary[left]qsort(ary,left,lp-1)qsort(ary,rp+1,right)return arya = [9,3,8,5]
b = quick_sort(a)
print("sequence is:", b)---------------------
作者:湾区Python
来源:CSDN
原文:https://blog.csdn.net/BTUJACK/article/details/80548249
版权声明:本文为博主原创文章,转载请附上博文链接!
认识你是我们的缘分,同学,等等,学习人工智能,记得关注我。
微信扫一扫
关注该公众号
《湾区人工智能》
快速排序总结,Python版相关推荐
- Python版快速排序算法
Python版冒泡排序算法请参考Python版冒泡法排序算法 Python版选择排序算法请参考Python版选择排序算法 from random import randint def quickSor ...
- Python版基于递归的冒泡排序算法
应读者要求,写个基于递归的冒泡排序算法代码,之前发过的排序算法代码请参考Python版快速排序算法,Python版选择排序算法,Python版冒泡法排序算法. from random import r ...
- 算法设计与分析(python版)-作业三
参考教材:算法设计与分析(Python版) 作者:王秋芬 1 . 普通 (5分)以下问题中,哪些问题的分治算法消耗的时间与输入序列无关.() A. 二分查找 B. 合并排序 C. 快速 ...
- 算法(Python版)|156Kstars|神级项目-(1)The Algorithms - Python简介
文章目录 算法(Python版) 项目地址 项目概况 说明 参与入门 社区频道 算法列表 Arithmetic Analysis 算术分析 Audio Filters 音频过滤器 Backtracki ...
- 2020-11-08 Windows应用程序设计作业(Python版实现)(一)简单语法
Windows应用程序设计作业(Python版实现) 作业1-语法 1.任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1.请编 ...
- 【Leetcode】刷题之路3(python版)
回溯专题 1.回溯算法的本质是n叉树的深度优先搜索,同时,需要注意剪枝减少复杂度. 2.回溯算法三部曲 确定参数和返回值 回溯函数终止条件 单层循环 3.回溯法思路 回溯法是一种算法思想,而递归是一种 ...
- 统计学习圣经!经典教材《统计学习导论》Python版
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 编辑:张倩,来源:机器之心 <统计学习导论>很经典,但习题用 ...
- python数据结构与算法分析_数据结构与算法(Python版)
为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...
- 经典教材《统计学习导论》现在有了Python版
来源:机器之心 本文约1000字,建议阅读5分钟 <统计学习导论>很经典,但用的是 R 语言,没关系,这里有份 Python 版习题实现. 斯坦福经典教材<The Element o ...
- 赞!经典教材《统计学习导论》终于有Python版了
<统计学习导论>是数据科学家中最受欢迎的书籍之一,旨在介绍机器学习算法背后的概念,但这本书的习题都是用R语言实现的,这对于主要使用 Python 语言的机器学习研究者来说不太友好. 为了解 ...
最新文章
- STM32F103C8/BT6最小系统原理图、PCB
- VMware HA实战攻略之四VMware HA安装及配置
- 安卓音频输出采样率_只有AirPods配有姓名吗?安卓的这些无线耳机也不错
- 数据库进阶系列之三:使用Logminer解析Oracle日志
- C语言 enum和typedef enum的区别
- 零基础 ABAP 学习教程系列文章的目录
- Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令
- Asp.net+Jquery实现用户信息异步验证
- 页面的加载与渲染顺序
- Drill官网文档翻译六:存储插件的注册
- 鄂尔多斯打造西部云计算基地
- CNN for image retrieval
- 通过文献DOI下载外文文献
- windows无法格式化u盘_U盘无法格式化的解决方法
- Inno SetUp中文语言包以及在脚本中使用
- 胡玉平 计算机科学,基于代价敏感混合分裂策略的多决策树算法
- 抖音直播运营分析:深入解读直播带货运营那些专业术语
- 今年天猫双11的这些技术,可能会改变整个零售行业
- 雷霆复鸣 决战巅峰 | 第七届XCTF国际网络攻防联赛总决赛即刻启航!
- 用python和ffmpeg批量合成bilibili缓存的m4s成mp4