快速排序是面试最常考内容,

让你描述算法,

让你写算法,

让你分析时间复杂度

#快速排序整理'''九章算法令狐冲老师排序思路:
先取到中心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版相关推荐

  1. Python版快速排序算法

    Python版冒泡排序算法请参考Python版冒泡法排序算法 Python版选择排序算法请参考Python版选择排序算法 from random import randint def quickSor ...

  2. Python版基于递归的冒泡排序算法

    应读者要求,写个基于递归的冒泡排序算法代码,之前发过的排序算法代码请参考Python版快速排序算法,Python版选择排序算法,Python版冒泡法排序算法. from random import r ...

  3. 算法设计与分析(python版)-作业三

    参考教材:算法设计与分析(Python版)         作者:王秋芬 1 . 普通 (5分)以下问题中,哪些问题的分治算法消耗的时间与输入序列无关.() A. 二分查找 B. 合并排序 C. 快速 ...

  4. 算法(Python版)|156Kstars|神级项目-(1)The Algorithms - Python简介

    文章目录 算法(Python版) 项目地址 项目概况 说明 参与入门 社区频道 算法列表 Arithmetic Analysis 算术分析 Audio Filters 音频过滤器 Backtracki ...

  5. 2020-11-08 Windows应用程序设计作业(Python版实现)(一)简单语法

    Windows应用程序设计作业(Python版实现) 作业1-语法 1.任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1.请编 ...

  6. 【Leetcode】刷题之路3(python版)

    回溯专题 1.回溯算法的本质是n叉树的深度优先搜索,同时,需要注意剪枝减少复杂度. 2.回溯算法三部曲 确定参数和返回值 回溯函数终止条件 单层循环 3.回溯法思路 回溯法是一种算法思想,而递归是一种 ...

  7. 统计学习圣经!经典教材《统计学习导论》Python版

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 编辑:张倩,来源:机器之心 <统计学习导论>很经典,但习题用 ...

  8. python数据结构与算法分析_数据结构与算法(Python版)

    为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...

  9. 经典教材《统计学习导论》现在有了Python版

    来源:机器之心 本文约1000字,建议阅读5分钟 <统计学习导论>很经典,但用的是 R 语言,没关系,这里有份 Python 版习题实现. 斯坦福经典教材<The Element o ...

  10. 赞!经典教材《统计学习导论》终于有Python版了

    <统计学习导论>是数据科学家中最受欢迎的书籍之一,旨在介绍机器学习算法背后的概念,但这本书的习题都是用R语言实现的,这对于主要使用 Python 语言的机器学习研究者来说不太友好. 为了解 ...

最新文章

  1. STM32F103C8/BT6最小系统原理图、PCB
  2. VMware HA实战攻略之四VMware HA安装及配置
  3. 安卓音频输出采样率_只有AirPods配有姓名吗?安卓的这些无线耳机也不错
  4. 数据库进阶系列之三:使用Logminer解析Oracle日志
  5. C语言 enum和typedef enum的区别
  6. 零基础 ABAP 学习教程系列文章的目录
  7. Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令
  8. Asp.net+Jquery实现用户信息异步验证
  9. 页面的加载与渲染顺序
  10. Drill官网文档翻译六:存储插件的注册
  11. 鄂尔多斯打造西部云计算基地
  12. CNN for image retrieval
  13. 通过文献DOI下载外文文献
  14. windows无法格式化u盘_U盘无法格式化的解决方法
  15. Inno SetUp中文语言包以及在脚本中使用
  16. 胡玉平 计算机科学,基于代价敏感混合分裂策略的多决策树算法
  17. 抖音直播运营分析:深入解读直播带货运营那些专业术语
  18. 今年天猫双11的这些技术,可能会改变整个零售行业
  19. 雷霆复鸣 决战巅峰 | 第七届XCTF国际网络攻防联赛总决赛即刻启航!
  20. 用python和ffmpeg批量合成bilibili缓存的m4s成mp4

热门文章

  1. 微信小程序|开发实战篇之一
  2. MySQL存储过程 游标
  3. 关于链表中经常用到的二级指针
  4. Algorithms - Insertion Sort - 插入排序
  5. socket编程小问题:地址已经被使用——Address already in use
  6. CentOS下安装postgresql
  7. python面试题之Python支持什么数据类型?
  8. 百度echars 插件 横坐标信息倾斜显示
  9. 笨办法学 Python · 续 练习 21:二分搜索
  10. 笨办法学 Python · 续 练习 12:复习