快速排序(Quick Sort)是对冒泡排序的一种改进,它采用了分治法(Divide and Conquer)的思想解决排序问题。
定义:快速排序的基本思想是将待排序的数据分为三部分:分区点(pivot)、小于分区点的元素(left partition)和大于分区点的元素(right partition)。然后通过递归调用,将左右两个分区再进行相同的操作,直至所有元素有序。
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
arr = [8, 2, 6, 3, 1, 5]
print(quick_sort(arr)) # 输出:[1, 2, 3, 5, 6, 8]
实例详解:
1. 从数组中选择一个元素作为分区点。
2. 将数组中的元素与分区点进行比较,小于分区点的元素移到左边,大于分区点的元素移到右边。 3. 递归进行步骤1和2,直到每个分区中的元素都有序。
快速排序与冒泡、选择、插入排序的对比:
1. 时间复杂度:快速排序的平均时间复杂度是O(n log n),而冒泡、选择、插入排序的时间复杂度均为O(n²),因此快速排序在大数据量情况下性能更优
2. 空间复杂度:快速排序的空间复杂度是O(log n),而冒泡、选择、插入排序的空间复杂度为O(1)。快速排序需要额外的空间来保存递归调用信息。
3. 稳定性:冒泡和插入排序是稳定的排序算法,而快速排序和选择排序是不稳定的。
场景举例:
NBA场景:假设我们需要对NBA球员按照得分(PPG, Points Per Game)进行排名。我们可以使用上述快速排序算法对球员进行排序。
实战解析:
-
首先获取球员得分数据,例如: players_ppg = {'LeBron James': 27.2, 'Kevin Durant': 29.5, 'Stephen Curry': 25.6, 'James Harden': 28.1, 'Russell Westbrook': 23.4}
-
将球员数据转换为列表形式,以方便排序: ppg_list = [(k, v) for k, v in players_ppg.items()]
-
使用快速排序算法对ppg_list进行降序排序(需要稍微修改quick_sort函数):
def quick_sort_desc(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2][1]
left = [x for x in arr if x[1] > pivot]
middle = [x for x in arr if x[1] == pivot]
right = [x for x in arr if x[1] < pivot]
return quick_sort_desc(left) + middle + quick_sort_desc(right)
sorted_players = quick_sort_desc(ppg_list)
- 打印排序后的球员排名:
for i, player in enumerate(sorted_players, 1):
print(f"{i}. {player[0]}: {player[1]} PPG")
最终得到的排名结果:
- Kevin Durant: 29.5 PPG
- James Harden: 28.1 PPG
- LeBron James: 27.2 PPG
- Stephen Curry: 25.6 PPG
- Russell Westbrook: 23.4 PPG