首页 技术 正文
技术 2022年11月19日
0 收藏 463 点赞 2,310 浏览 1786 个字

有趣的事,Python永远不会缺席!

如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10768593.html

  排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。其中”快速排序”(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的。

一、快速排序(Quicksort)

  快速排序(quick sort)的采用了分治的策略。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

1、原理

  1. 在数列之中,选择一个元素作为”基准”(pivot),或者叫比较值。

  2. 数列中所有元素都和这个基准值进行比较,如果比基准值小就移到基准值的左边,如果比基准值大就移到基准值的右边

  3. 以基准值左右两边的子列作为新数列,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举个例子,假设我现在有一个数列需要使用快排来排序:[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],我们来看看使用快排的详细步骤:

  1. 选取中间的66作为基准值(基准值可以随便选)

  2. 数列从第一个元素11开始和基准值66进行比较,小于基准值,那么将它放入左边的分区中,第二个元素99比基准值66大,把它放入右边的分区中。

  3. 然后依次对左右两个分区进行再分区,直到最后只有一个元素

  4. 分解完成再一层一层返回,返回规则是:左边分区+基准值+右边分区

2、代码

代码用jupyternotebook实现

 def quick_sort(b):
"""快速排序"""
if len(b) < 2:
return arr
# 选取基准,随便选哪个都可以,选中间的便于理解
mid = arr[len(b) // 2]
# 定义基准值左右两个数列
left, right = [], []
# 从原始数组中移除基准值
b.remove(mid)
for item in b:
# 大于基准值放右边
if item >= mid:
right.append(item)
else:
# 小于基准值放左边
left.append(item)
# 使用迭代进行比较
return quick_sort(left) + [mid] + quick_sort(right)

b = [11, 99, 33, 69, 77, 88, 55, 11, 33, 36, 39, 66, 44, 22]
quick_sort(b)#返回:[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]

  高逼格(一行代码表示):

 quick_sort = lambda array: array if len(array) <= 1 else quick_sort([
item for item in array[1:] if item <= array[0]
]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]]) quick_sort([2,5,9,3,7,1,5])
#返回[1, 2, 3, 5, 5, 7, 9]

3、特点

  1. 稳定性:快排是一种不稳定排序,比如基准值的前后都存在与基准值相同的元素,那么相同值就会被放在一边,这样就打乱了之前的相对顺序

  2. 比较性:因为排序时元素之间需要比较,所以是比较排序

  3. 时间复杂度:快排的时间复杂度为O(nlogn)

  4. 空间复杂度:排序时需要另外申请空间,并且随着数列规模增大而增大,其复杂度为:O(nlogn)

  5. 归并排序与快排 :归并排序与快排两种排序思想都是分而治之,但是它们分解和合并的策略不一样:归并是从中间直接将数列分成两个,而快排是比较后将小的放左边大的放右边,所以在合并的时候归并排序还是需要将两个数列重新再次排序,而快排则是直接合并不再需要排序,所以快排比归并排序更高效一些,可以从示意图中比较二者之间的区别。

  6. 快速排序有一个缺点就是对于小规模的数据集性能不是很好

结果   

  Successfully !!!

  有趣的事,Python永远不会缺席!还不来加我,瞅什么瞅。

Python排序算法——快速排序

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,038
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,523
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,372
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,152
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,785
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,867