defbubble_sort(arr): n = len(arr) for i inrange(n): for j inrange(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr
print(bubble_sort([64, 34, 25, 12, 22, 11, 90]))
选择排序
选择排序每次从未排序部分选出最小元素放到已排序部分末尾:
1 2 3 4 5 6 7 8 9 10
defselection_sort(arr): n = len(arr) for i inrange(n): min_idx = i for j inrange(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr
快速排序
快速排序采用分治思想,通过选择基准元素将数组分成两部分:
1 2 3 4 5 6 7 8 9 10 11 12
defquick_sort(arr): 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)
defmerge_sort(arr): iflen(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right)
defmerge(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
查找算法
线性查找
线性查找逐个检查数组元素:
1 2 3 4 5 6 7 8
deflinear_search(arr, target): for i, val inenumerate(arr): if val == target: return i return-1