Python常用算法——排序算法
📘 Python 排序算法全解析:从冒泡到堆排,手写代码带你彻底搞懂
排序算法是计算机科学中最基础的内容之一,也是面试中的常客。Python 凭借其简洁的语法,成为学习和实现排序算法的绝佳语言。本文整理了多种经典排序算法的 Python 实现,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序和基数排序,并附有详细注释和示例,帮助你理解每一种算法的核心思想与实现细节。
一、冒泡排序(Bubble Sort)
冒泡排序通过重复遍历待排序序列,比较相邻元素并交换顺序错误的元素,每一轮将最大(或最小)的元素“冒泡”到末尾。
基础版
def bubble_sort(collection):
length = len(collection)
for i in range(length - 1):
for j in range(length - 1 - i):
if collection[j] > collection[j + 1]:
collection[j], collection[j + 1] = collection[j + 1], collection[j]
return collection
优化版(加入交换标志)
def bubble_sort2(collection):
length = len(collection)
for i in range(length - 1):
swapped = False
for j in range(length - 1 - i):
if collection[j] > collection[j + 1]:
collection[j], collection[j + 1] = collection[j + 1], collection[j]
swapped = True
if not swapped:
break
return collection
二、选择排序(Selection Sort)
每次从待排序序列中选出最小(或最大)的元素,放到已排序序列的末尾。
def selection_sort(arr):
for i in range(len(arr)):
min_idx = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
三、插入排序(Insertion Sort)
将未排序序列中的元素逐个插入到已排序序列的合适位置。
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr
四、希尔排序(Shell Sort)
希尔排序是插入排序的改进版,通过设置间隔(gap)将序列分组,对每组进行插入排序,逐步缩小间隔。
def shell_sort(arr):
n = len(arr)
gap = n // 2
while gap > 0:
for i in range(gap, n):
temp = arr[i]
j = i
while j >= gap and arr[j - gap] > temp:
arr[j] = arr[j - gap]
j -= gap
arr[j] = temp
gap //= 2
return arr
五、归并排序(Merge Sort)
采用分治法,将序列递归拆分为子序列,排序后再合并。
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
六、快速排序(Quick Sort)
选择一个基准元素,将序列分为小于基准和大于基准两部分,递归排序。
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)
七、堆排序(Heap Sort)
利用堆这种数据结构进行排序,分为建堆和调整堆两个阶段。
def heapify(arr, n, i):
largest = i
left = 2 * i + 1
right = 2 * i + 2
if 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)
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
八、基数排序(Radix Sort)
按照低位到高位的顺序,对每一位进行稳定排序(通常使用计数排序)。
def radix_sort(arr):
max_num = max(arr)
exp = 1
while max_num // exp > 0:
buckets = [[] for _ in range(10)]
for num in arr:
radix = (num // exp) % 10
buckets[radix].append(num)
i = 0
for bucket in buckets:
for num in bucket:
arr[i] = num
i += 1
exp *= 10
return arr
📌 总结
| 算法 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|
| 冒泡排序 | O(n²) | O(1) | 稳定 |
| 选择排序 | O(n²) | O(1) | 不稳定 |
| 插入排序 | O(n²) | O(1) | 稳定 |
| 希尔排序 | O(n log n) ~ O(n²) | O(1) | 不稳定 |
| 归并排序 | O(n log n) | O(n) | 稳定 |
| 快速排序 | O(n log n) | O(log n) | 不稳定 |
| 堆排序 | O(n log n) | O(1) | 不稳定 |
| 基数排序 | O(nk) | O(n+k) | 稳定 |
本文是原创文章,完整转载请注明作者 尤沐溪
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果