排序算法之快速排序Python

本文介绍了快速排序这种逻辑意义上的分治法。不同于归并排序的物理分治,快速排序根据数值来分割序列,通过选取一个元素并找到其正确位置,使得序列被分成两部分,一部分所有元素小于选取元素,另一部分所有元素大于选取元素。然后递归地对这两部分进行快速排序。文章详细解释了选取特殊元素、遍历和交换元素的过程,并提供了作者逐步改进的Python代码实现。快速排序的时间复杂度为O(nlogn),相比归并排序在空间效率上有优势。
摘要由CSDN通过智能技术生成

排序算法之快速排序

介绍一种新的排序算法,快速排序。前面一片文章中介绍了归并排序,简单的说,归并排序是物理意义上的分治法,就是把前面几个位置(下标)上的元素看成一个子序列,后面几个位置(下标)上的元素看成一个子序列。然后再将每个子序列继续分而治之,直到每个子序列只有一个元素,这样作为有序序列向上归并。
那么这样做的时间复杂度为O(nlogn),但是空间上需要多备份一份,作为新的序列,空间复杂度为O(n),如果需要排序的数据集特别大,这时候就要仔细考虑一下了。
可以思考一种逻辑意义上的分治法,或者说是内容上的分治法。不是按照下标来分割序列,而是根据数值来分治,每次根据一个数将序列分割成两个子序列和这个数,一个子序列的元素全部比这个数小,另一个子序列,全部比这个数大,并将原始序列的元素位置按照分割的序列进行排列。然后再分别两个子序列继续分割,直到每个子序列只有一个元素。这样,每个子序列都是由“特殊的数”连接起来,这个”特殊的数”的左边都比它小,右边都比它大,所以整体上肯定是排好序的。这就是快速排序。其实简单的说就是找中间元素(或者说选取的元素)的位置。

那么这个特殊的数怎么选取呢?理想状态下肯定是选取的数就是整个序列的中间值,这样每次都是均分的。但是实际上这是不可能的,因为事先并不知道中间值到底是多少,而查找中间值也是有开销的。所以一般情况下是随机选取序列中的一个数,我们选取的是第一个元素

接下来叙述一下快速排序的具体原理过程。

  1. 对于给定的一个待排序列,选取首元素作为分割序列的数值(也就是最终的序列中,首元素所在的位置的左面一定都是比首元素小的,右面一定都是比首元素大的)。然后分别从第二个元素起向后遍历和最后一个元素位置起向前遍历
  2. 向后遍历时,当遇到比首元素大的元素时,停止遍历。
  3. 向前遍历时,当遇到比首元素小的元素时,停止遍历。
  4. 注意在2和3步的过程中,一定要保证向后遍历的位置一定要在向前遍历的前面(或者说左面,即向后遍历的下标一定要小于向前遍历的下标,就像两个人过独木桥那样,一定要保证二者没有相遇)。没有相遇,说明二者还没有遍历完整个序列,也就是二者中间还有一定长度个数的元素,也就是还没有到达逻辑意义上的中点,也就是还没有到达首元素该有的位置。
  5. 2和3都停止遍历时,判断是否符合4的规定,如果符合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值