1. 基础排序算法
1.1 冒泡排序(Bubble Sort)
原理 :
依次比较相邻元素,将较大的元素逐步"冒泡"到右侧。
python
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break
return arr
时间复杂度:
- 最佳:O(n)(已有序时)
- 平均/最差:O(n²)
适用场景:教学用途或小型数据集
1.2 选择排序(Selection Sort)
原理 :
每次遍历选择未排序部分的最小值,放到已排序序列末尾。
python
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
时间复杂度:
- 所有情况:O(n²)
适用场景:内存敏感的小型数据集
1.3 插入排序(Insertion Sort)
原理 :
将每个元素插入到已排序序列的合适位置。
python
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i-1
while j >=0 and key < arr[j]:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
return arr
时间复杂度:
- 最佳:O(n)(已有序时)
- 平均/最差:O(n²)
适用场景:小规模数据或基本有序的数据
2. 高效排序算法
2.1 快速排序(Quick Sort)
原理 :
分治策略,选取基准值将数组分为两部分递归排序。
python
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)
时间复杂度:
- 平均:O(n log n)
- 最差:O(n²)(当已有序且选第一个元素为基准时)
优化 :三数取中法选择基准
适用场景:通用排序,尤其适合大规模随机数据
2.2 归并排序(Merge Sort)
原理 :
分治法将数组拆分为最小单元后合并排序。
python
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr)//2
L = arr[:mid]
R = arr[mid:]
merge_sort(L)
merge_sort(R)
i = j = k = 0
while i < len(L) and j < len(R):
if L[i] < R[j]:
arr[k] = L[i]
i += 1
else:
arr[k] = R[j]
j += 1
k += 1
while i < len(L):
arr[k] = L[i]
i += 1
k += 1
while j < len(R):
arr[k] = R[j]
j += 1
k += 1
return arr
时间复杂度:
- 所有情况:O(n log n)
适用场景:需要稳定排序且内存充足时
2.3 堆排序(Heap Sort)
原理 :
利用堆数据结构实现选择排序。
python
def heapify(arr, n, i):
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and arr[i] < arr[l]:
largest = l
if r < n and arr[largest] < arr[r]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heap_sort(arr):
n = len(arr)
for i in range(n//2-1, -1, -1):
heapify(arr, n, i)
for i in range(n-1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, i, 0)
return arr
时间复杂度:
- 所有情况:O(n log n)
适用场景:需要O(1)空间复杂度的高效排序
3. 特殊场景算法
3.1 计数排序(Counting Sort)
原理 :
统计元素出现次数,适用于整数范围较小的情况。
python
def counting_sort(arr):
max_val = max(arr)
count = [0] * (max_val+1)
for num in arr:
count[num] += 1
sorted_arr = []
for i in range(len(count)):
sorted_arr.extend([i]*count[i])
return sorted_arr
时间复杂度:
- O(n + k)(k为数据范围)
适用场景:整数排序且值域较小
3.2 基数排序(Radix Sort)
原理 :
按位排序,从低位到高位依次排序。
python
def counting_sort_for_radix(arr, exp):
n = len(arr)
output = [0] * n
count = [0] * 10
for i in range(n):
index = (arr[i] // exp) % 10
count[index] += 1
for i in range(1,10):
count[i] += count[i-1]
i = n-1
while i >= 0:
index = (arr[i] // exp) % 10
output[count[index]-1] = arr[i]
count[index] -= 1
i -= 1
for i in range(n):
arr[i] = output[i]
def radix_sort(arr):
max_val = max(arr)
exp = 1
while max_val // exp > 0:
counting_sort_for_radix(arr, exp)
exp *= 10
return arr
时间复杂度:
- O(nk)(k为最大位数)
适用场景:整数或字符串排序
4. Python内置排序
Python的sorted()
和list.sort()
使用Timsort算法(归并排序+插入排序的混合算法):
python
# 基本排序
sorted_list = sorted([3,1,4,2])
lst = [3,1,4,2]
lst.sort()
# 自定义排序
sorted(students, key=lambda x: x.age) # 按对象属性排序
sorted(words, key=len) # 按字符串长度排序
算法对比表
算法 | 时间复杂度(平均) | 是否稳定 | 是否原地 | 适用场景 |
---|---|---|---|---|
冒泡排序 | O(n²) | 是 | 是 | 教学/小数据 |
快速排序 | O(n log n) | 否 | 是 | 通用大规模数据 |
归并排序 | O(n log n) | 是 | 否 | 需要稳定排序 |
堆排序 | O(n log n) | 否 | 是 | 内存敏感的大数据 |
Timsort | O(n log n) | 是 | 是 | Python内置通用排序 |
选择建议
- 小数据量(n < 1000):插入排序或选择排序
- 通用场景 :优先使用内置的
sorted()
或list.sort()
- 内存敏感:堆排序
- 稳定排序需求:归并排序或Timsort
- 整数范围小:计数排序/基数排序