快速排序是一种基于分治思想的排序算法,效率非常高。它通过在序列中寻找一个主元,将小于主元的元素放在左边,大于主元的元素放在右边,然后在左右子序列中分别递归地应用快速排序。下面将从算法流程、时间复杂度、优缺点、代码示例几个方面详细介绍快速排序。
一、算法流程
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
微信扫一扫
支付宝扫一扫