七大排序算法详解与实现
七大排序算法的基本原理
冒泡排序(Bubble Sort)
冒泡排序通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。每一轮遍历会将当前未排序部分的最大元素“冒泡”到正确的位置。
时间复杂度:
- 最优情况:$O(n)$(列表已经有序)
- 最坏情况:$O(n^2)$(列表完全逆序)
- 平均情况:$O(n^2)$
空间复杂度:$O(1)$(原地排序)
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
选择排序(Selection Sort)
选择排序每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。它是一种不稳定的排序算法。
时间复杂度:
- 最优、最坏和平均情况均为 $O(n^2)$
空间复杂度:$O(1)$
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]
插入排序(Insertion Sort)
插入排序通过构建有序序列,逐步将未排序部分的元素插入到已排序部分的适当位置。对于小规模或基本有序的数据效率较高。
时间复杂度:
- 最优情况:$O(n)$(列表已经有序)
- 最坏情况:$O(n^2)$(列表完全逆序)
- 平均情况:$O(n^2)$
空间复杂度:$O(1)$
def insertion_sort(arr):
n = len(arr)
for i in range(1, n):
key = arr[i]
j = i-1
while j >=0 and key < arr[j]:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
归并排序(Merge Sort)
归并排序采用分治法,将列表分成两半,递归排序后再合并。它是一种稳定的排序算法。
时间复杂度:
- 最优、最坏和平均情况均为 $O(n \log n)$
空间复杂度:$O(n)$(需要额外的存储空间)
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
快速排序(Quick Sort)
快速排序通过选择一个“基准”元素,将列表分为小于基准和大于基准的两部分,再递归排序这两部分。它是一种高效的排序算法,但不稳定。
时间复杂度:
- 最优和平均情况:$O(n \log n)$
- 最坏情况:$O(n^2)$(当基准选择不当时)
空间复杂度:$O(\log n)$(递归调用栈)
def quick_sort(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quick_sort(arr, low, pi-1)
quick_sort(arr, pi+1, high)
def partition(arr, low, high):
pivot = arr[high]
i = low - 1
for j in range(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
堆排序(Heap Sort)
堆排序利用堆数据结构,将列表构建为大顶堆或小顶堆,再逐步取出堆顶元素完成排序。它是一种不稳定的排序算法。
时间复杂度:
- 最优、最坏和平均情况均为 $O(n \log n)$
空间复杂度:$O(1)$
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)
计数排序(Counting Sort)
计数排序通过统计每个元素的出现次数,直接确定元素在输出数组中的位置。它是一种非比较排序算法,适用于整数数据且范围较小的情况。
时间复杂度:
- 最优、最坏和平均情况均为 $O(n + k)$($k$ 是数据范围)
空间复杂度:$O(n + k)$
def counting_sort(arr):
max_val = max(arr)
min_val = min(arr)
range_val = max_val - min_val + 1
count = [0] * range_val
output = [0] * len(arr)
for num in arr:
count[num - min_val] += 1
for i in range(1, len(count)):
count[i] += count[i-1]
for num in reversed(arr):
output[count[num - min_val] - 1] = num
count[num - min_val] -= 1
return output
总结
七大排序算法各有特点:
- 冒泡排序、选择排序、插入排序适合小规模数据或教学演示。
- 归并排序、快速排序、堆排序适合大规模数据,时间复杂度为 $O(n \log n)$。
- 计数排序适用于特定场景(如整数且范围较小)。
根据数据规模、稳定性和内存限制选择合适的算法。
BbS.okacop010.info/PoSt/1120_752443.HtM
BbS.okacop011.info/PoSt/1120_271416.HtM
BbS.okacop012.info/PoSt/1120_938035.HtM
BbS.okacop013.info/PoSt/1120_386142.HtM
BbS.okacop014.info/PoSt/1120_975930.HtM
BbS.okacop015.info/PoSt/1120_896431.HtM
BbS.okacop016.info/PoSt/1120_244264.HtM
BbS.okacop017.info/PoSt/1120_756980.HtM
BbS.okacop018.info/PoSt/1120_717229.HtM
BbS.okacop019.info/PoSt/1120_046442.HtM
BbS.okacop010.info/PoSt/1120_097143.HtM
BbS.okacop011.info/PoSt/1120_151244.HtM
BbS.okacop012.info/PoSt/1120_425306.HtM
BbS.okacop013.info/PoSt/1120_849256.HtM
BbS.okacop014.info/PoSt/1120_340015.HtM
BbS.okacop015.info/PoSt/1120_560684.HtM
BbS.okacop016.info/PoSt/1120_897492.HtM
BbS.okacop017.info/PoSt/1120_598994.HtM
BbS.okacop018.info/PoSt/1120_894801.HtM
BbS.okacop019.info/PoSt/1120_970783.HtM
BbS.okacop010.info/PoSt/1120_979588.HtM
BbS.okacop011.info/PoSt/1120_358342.HtM
BbS.okacop012.info/PoSt/1120_781869.HtM
BbS.okacop013.info/PoSt/1120_553555.HtM
BbS.okacop014.info/PoSt/1120_809833.HtM
BbS.okacop015.info/PoSt/1120_530348.HtM
BbS.okacop016.info/PoSt/1120_801880.HtM
BbS.okacop017.info/PoSt/1120_073939.HtM
BbS.okacop018.info/PoSt/1120_289418.HtM
BbS.okacop019.info/PoSt/1120_299878.HtM
BbS.okacop010.info/PoSt/1120_134824.HtM
BbS.okacop011.info/PoSt/1120_194771.HtM
BbS.okacop012.info/PoSt/1120_118109.HtM
BbS.okacop013.info/PoSt/1120_643304.HtM
BbS.okacop014.info/PoSt/1120_271274.HtM
BbS.okacop015.info/PoSt/1120_598606.HtM
BbS.okacop016.info/PoSt/1120_439622.HtM
BbS.okacop017.info/PoSt/1120_301077.HtM
BbS.okacop018.info/PoSt/1120_058354.HtM
BbS.okacop019.info/PoSt/1120_514682.HtM
BbS.okacop010.info/PoSt/1120_993222.HtM
BbS.okacop011.info/PoSt/1120_852269.HtM
BbS.okacop012.info/PoSt/1120_224904.HtM
BbS.okacop013.info/PoSt/1120_701616.HtM
BbS.okacop014.info/PoSt/1120_465617.HtM
BbS.okacop015.info/PoSt/1120_814894.HtM
BbS.okacop016.info/PoSt/1120_482508.HtM
BbS.okacop017.info/PoSt/1120_045358.HtM
BbS.okacop018.info/PoSt/1120_852482.HtM
BbS.okacop019.info/PoSt/1120_836008.HtM
BbS.okacop010.info/PoSt/1120_130949.HtM
BbS.okacop011.info/PoSt/1120_690366.HtM
BbS.okacop012.info/PoSt/1120_530520.HtM
BbS.okacop013.info/PoSt/1120_832170.HtM
BbS.okacop014.info/PoSt/1120_986600.HtM
BbS.okacop015.info/PoSt/1120_456313.HtM
BbS.okacop016.info/PoSt/1120_171682.HtM
BbS.okacop017.info/PoSt/1120_167018.HtM
BbS.okacop018.info/PoSt/1120_394521.HtM
BbS.okacop019.info/PoSt/1120_547832.HtM
BbS.okacop010.info/PoSt/1120_380639.HtM
BbS.okacop011.info/PoSt/1120_971815.HtM
BbS.okacop012.info/PoSt/1120_224633.HtM
BbS.okacop013.info/PoSt/1120_030484.HtM
BbS.okacop014.info/PoSt/1120_207083.HtM
BbS.okacop015.info/PoSt/1120_733311.HtM
BbS.okacop016.info/PoSt/1120_958013.HtM
BbS.okacop017.info/PoSt/1120_643834.HtM
BbS.okacop018.info/PoSt/1120_115540.HtM
BbS.okacop019.info/PoSt/1120_038688.HtM
BbS.okacop010.info/PoSt/1120_234887.HtM
BbS.okacop011.info/PoSt/1120_560421.HtM
BbS.okacop012.info/PoSt/1120_082561.HtM
BbS.okacop013.info/PoSt/1120_973500.HtM
BbS.okacop014.info/PoSt/1120_769849.HtM
BbS.okacop015.info/PoSt/1120_222105.HtM
BbS.okacop016.info/PoSt/1120_897240.HtM
BbS.okacop017.info/PoSt/1120_787240.HtM
BbS.okacop018.info/PoSt/1120_387886.HtM
BbS.okacop019.info/PoSt/1120_971698.HtM