快速排序是一种基于分治思想的排序算法,效率非常高。它通过在序列中寻找一个主元,将小于主元的元素放在左边,大于主元的元素放在右边,然后在左右子序列中分别递归地应用快速排序。下面将从算法流程、时间复杂度、优缺点、代码示例几个方面详细介绍快速排序。
一、算法流程
1、选取主元
首先在序列中选择一个主元,可以选择第一个元素或随机选择一个元素作为主元。
function choose_pivot(seq): return seq[0]
2、分区
将序列中的元素分为两部分,一部分是小于主元的元素,另一部分是大于主元的元素。可以用两个指针i,j来实现分区。
function partition(seq, pivot): i, j = 0, len(seq)-1 while i <= j: while seq[i] < pivot: i += 1 while seq[j] > pivot: j -= 1 if i <= j: seq[i], seq[j] = seq[j], seq[i] i += 1 j -= 1 return i
3、递归排序
对左右两个子序列分别递归地应用快速排序。
function quicksort(seq): if len(seq) <= 1: return seq pivot = choose_pivot(seq) index = partition(seq, pivot) left_seq = quicksort(seq[:index]) right_seq = quicksort(seq[index:]) return left_seq + right_seq
二、时间复杂度
快速排序的时间复杂度为O(nlogn)或O(n^2)。
在最好的情况下,每次分区都能将序列均匀地分成两部分,递归树的深度为log2n,每一层需要进行n次操作,因此时间复杂度为O(nlogn)。
在最坏的情况下,每次分区都只能将序列分成一部分和另一部分,递归树的深度为n-1,每一层需要进行n次操作,因此时间复杂度为O(n^2)。但是在实际应用中,最坏情况发生的概率比较小。
三、优缺点
优点:
1、效率高,在大多数情况下比其他排序算法效率更高。
2、空间复杂度低,只需要一个额外的空间来存储主元的值。
3、易于实现。
缺点:
1、当序列中存在大量相同的元素时,快速排序的效率会比较低。
2、不稳定性排序,排序后相同元素的顺序可能会改变。
四、代码示例
下面是Python代码实现:
def choose_pivot(seq): return seq[0] def partition(seq, pivot): i, j = 0, len(seq)-1 while i <= j: while seq[i] < pivot: i += 1 while seq[j] > pivot: j -= 1 if i <= j: seq[i], seq[j] = seq[j], seq[i] i += 1 j -= 1 return i def quicksort(seq): if len(seq) <= 1: return seq pivot = choose_pivot(seq) index = partition(seq, pivot) left_seq = quicksort(seq[:index]) right_seq = quicksort(seq[index:]) return left_seq + right_seq seq = [5, 1, 9, 3, 7, 4, 8, 6, 2] print(quicksort(seq))
原创文章,作者:NVQQB,如若转载,请注明出处:https://www.506064.com/n/374503.html