快速排序的基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
import random
def quick_sort(data_list):
length = len(data_list)
quick_sort_c(data_list, 0, length - 1)
def quick_sort_c(data_list, begin, end):
if begin >= end:
return
else:
index = partition(data_list, begin, end)
print(data_list)
quick_sort_c(data_list, begin, index - 1)
quick_sort_c(data_list, index + 1, end)
def partition(data_list, begin, end):
partition_key = data_list[end]
index = begin
for i in range(begin, end):
if data_list[i] < partition_key:
data_list[i], data_list[index] = data_list[index], data_list[i]
index += 1
data_list[index], data_list[end] = data_list[end], data_list[index]
return index
data_list = [random.randint(0, 100) for i in range(10)]
print("原始数组:", data_list)
print("排序过程:")
quick_sort(data_list)
print("排序结果:", data_list)
原始数组: [81, 79, 0, 42, 77, 4, 99, 45, 69, 82]
排序过程:
[81, 79, 0, 42, 77, 4, 45, 69, 82, 99]
[0, 42, 4, 45, 69, 81, 79, 77, 82, 99]
[0, 42, 4, 45, 69, 81, 79, 77, 82, 99]
[0, 4, 42, 45, 69, 81, 79, 77, 82, 99]
[0, 4, 42, 45, 69, 77, 79, 81, 82, 99]
[0, 4, 42, 45, 69, 77, 79, 81, 82, 99]
排序结果: [0, 4, 42, 45, 69, 77, 79, 81, 82, 99]
Process finished with exit code 0
性能分析
快速排序是一种原地排序算法,不需要借助额外的存储空间;由于分区的过程中由于其他元素的影响,在交换位置时会破坏原有的先后顺序,比如 3,5,6,3,2 在第一次分区 后,两个 3 的相对次序已经改变,因此快速排序是一种不稳定的排序算法;
时间复杂度 为 O(nlogn)
def find_top_k(data_list, k):
length = len(data_list)
begin = 0
end = length - 1
index = partition(data_list, begin, end)
while index != length - k:
if index > length - k:
end = index - 1
index = partition(data_list, begin, end)
else:
begin = index + 1
index = partition(data_list, index + 1, end)
return data_list[index]
for i in [1, 2, 3, 4, 5]:
print(f"第{i}大元素是{find_top_k(data_list, i)}")
第1大元素是95
第2大元素是89
第3大元素是87
第4大元素是50
第5大元素是35