排序算法-快速排序
快速排序的基本思想:
通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列
?
?
?
import randomdef 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:returnelse: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 = beginfor i in range(begin, end):if data_list[i] < partition_key:data_list[i], data_list[index] = data_list[index], data_list[i]index += 1data_list[index], data_list[end] = data_list[end], data_list[index]return indexdata_list = [random.randint(0, 100) for i in range(10)] print("原始數(shù)組:", data_list) print("排序過程:") quick_sort(data_list) print("排序結(jié)果:", data_list)原始數(shù)組: [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] 排序結(jié)果: [0, 4, 42, 45, 69, 77, 79, 81, 82, 99]Process finished with exit code 0?
性能分析
快速排序是一種原地排序算法,不需要借助額外的存儲空間;由于分區(qū)的過程中由于其他元素的影響,在交換位置時會破壞原有的先后順序,比如 3,5,6,3,2 在第一次分區(qū) 后,兩個 3 的相對次序已經(jīng)改變,因此快速排序是一種不穩(wěn)定的排序算法;
時間復雜度 為 O(nlogn)
def find_top_k(data_list, k):length = len(data_list)begin = 0end = length - 1index = partition(data_list, begin, end)while index != length - k:if index > length - k:end = index - 1index = partition(data_list, begin, end)else:begin = index + 1index = 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總結(jié)