defquick_sort(arr):"""
快速排序算法
时间复杂度: 平均 O(n log n),最坏 O(n²)
空间复杂度: O(log n)
稳定性: 不稳定
"""iflen(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)# 原地快速排序版本defquick_sort_inplace(arr, low=0, high=None):"""
原地快速排序
"""if high isNone:
high =len(arr)-1
arr = arr.copy()if low < high:
pi = partition(arr, low, high)
quick_sort_inplace(arr, low, pi -1)
quick_sort_inplace(arr, pi +1, high)return arr
defpartition(arr, low, high):"""
分区函数
"""
pivot = arr[high]
i = low -1for j inrange(low, high):if arr[j]< pivot:
i +=1
arr[i], arr[j]= arr[j], arr[i]
arr[i +1], arr[high]= arr[high], arr[i +1]return i +1# 示例使用
arr4 =[64,34,25,12,22,11,90]print('原数组:', arr4)print('快速排序结果:', quick_sort(arr4))
defheap_sort(arr):"""
堆排序算法
时间复杂度: O(n log n)
空间复杂度: O(1)
稳定性: 不稳定
"""
result = arr.copy()
n =len(result)# 构建最大堆for i inrange(n //2-1,-1,-1):
heapify(result, n, i)# 逐个提取元素for i inrange(n -1,0,-1):
result[0], result[i]= result[i], result[0]# 将当前最大元素移到末尾
heapify(result, i,0)# 重新调整堆return result
defheapify(arr, n, i):"""
调整堆结构
"""
largest = i
left =2* i +1
right =2* i +2if left < n and arr[left]> arr[largest]:
largest = left
if right < n and arr[right]> arr[largest]:
largest = right
if largest != i:
arr[i], arr[largest]= arr[largest], arr[i]
heapify(arr, n, largest)# 示例使用
arr6 =[64,34,25,12,22,11,90]print('原数组:', arr6)print('堆排序结果:', heap_sort(arr6))
7. 计数排序 (Counting Sort)
defcounting_sort(arr):"""
计数排序算法(适用于范围较小的整数)
时间复杂度: O(n + k),k为数据范围
空间复杂度: O(k)
稳定性: 稳定
"""ifnot arr:return arr
# 找到最大值和最小值
min_val =min(arr)
max_val =max(arr)# 创建计数数组
count =[0]*(max_val - min_val +1)# 统计每个元素出现的次数for num in arr:
count[num - min_val]+=1# 重构排序后的数组
result =[]for i inrange(len(count)):
result.extend([i + min_val]* count[i])return result
# 示例使用
arr7 =[4,2,2,8,3,3,1]print('原数组:', arr7)print('计数排序结果:', counting_sort(arr7))