|
| 1 | +def bubble_sort(a): |
| 2 | + for i in range(len(a)-1): |
| 3 | + for j in range(len(a)-1-i): |
| 4 | + if a[j] > a[j+1]: |
| 5 | + a[j], a[j+1] = a[j+1], a[j] |
| 6 | + print(f"冒泡交换 {a[j]}↔{a[j+1]},当前序列:{a}") |
| 7 | + return a |
| 8 | + |
| 9 | +def insertion_sort(a): |
| 10 | + for i in range(1,len(a)): |
| 11 | + while i>0 and a[i]<a[i-1]: |
| 12 | + a[i], a[i-1] = a[i-1], a[i] |
| 13 | + print(f"插入移动 {a[i]}→位置{i},当前序列:{a}") |
| 14 | + i -= 1 |
| 15 | + return a |
| 16 | + |
| 17 | +def selection_sort(a): |
| 18 | + for i in range(len(a)): |
| 19 | + min_idx = i |
| 20 | + for j in range(i+1, len(a)): |
| 21 | + if a[j] < a[min_idx]: |
| 22 | + min_idx = j |
| 23 | + a[i], a[min_idx] = a[min_idx], a[i] |
| 24 | + print(f"选择交换 {a[i]}↔{a[min_idx]},当前序列:{a}") |
| 25 | + return a |
| 26 | + |
| 27 | +def quick_sort(a): |
| 28 | + if len(a) <= 1: |
| 29 | + return a |
| 30 | + pivot = a[len(a)//2] |
| 31 | + left = [x for x in a if x < pivot] |
| 32 | + middle = [x for x in a if x == pivot] |
| 33 | + right = [x for x in a if x > pivot] |
| 34 | + return quick_sort(left) + middle + quick_sort(right) |
| 35 | + |
| 36 | +def merge_sort(a): |
| 37 | + if len(a) <= 1: |
| 38 | + return a |
| 39 | + mid = len(a)//2 |
| 40 | + left = merge_sort(a[:mid]) |
| 41 | + right = merge_sort(a[mid:]) |
| 42 | + return merge(left, right) |
| 43 | + |
| 44 | +def merge(left, right): |
| 45 | + result = [] |
| 46 | + i = j = 0 |
| 47 | + while i < len(left) and j < len(right): |
| 48 | + if left[i] < right[j]: |
| 49 | + result.append(left[i]) |
| 50 | + i += 1 |
| 51 | + else: |
| 52 | + result.append(right[j]) |
| 53 | + j += 1 |
| 54 | + result.extend(left[i:]) |
| 55 | + result.extend(right[j:]) |
| 56 | + return result |
| 57 | + |
| 58 | +def shell_sort(a): |
| 59 | + n = len(a) |
| 60 | + gap = n // 2 |
| 61 | + while gap > 0: |
| 62 | + for i in range(gap, n): |
| 63 | + temp = a[i] |
| 64 | + j = i |
| 65 | + while j >= gap and a[j - gap] > temp: |
| 66 | + a[j] = a[j - gap] |
| 67 | + j -= gap |
| 68 | + a[j] = temp |
| 69 | + gap //= 2 |
| 70 | + return a |
| 71 | + |
| 72 | +def heap_sort(a): |
| 73 | + def heapify(a, n, i): |
| 74 | + largest = i |
| 75 | + l = 2 * i + 1 |
| 76 | + r = 2 * i + 2 |
| 77 | + if l < n and a[i] < a[l]: |
| 78 | + largest = l |
| 79 | + if r < n and a[largest] < a[r]: |
| 80 | + largest = r |
| 81 | + if largest != i: |
| 82 | + a[i], a[largest] = a[largest], a[i] |
| 83 | + heapify(a, n, largest) |
| 84 | + |
| 85 | + n = len(a) |
| 86 | + for i in range(n//2 - 1, -1, -1): |
| 87 | + heapify(a, n, i) |
| 88 | + for i in range(n-1, 0, -1): |
| 89 | + a[i], a[0] = a[0], a[i] |
| 90 | + heapify(a, i, 0) |
| 91 | + return a |
| 92 | + |
| 93 | +if __name__ == "__main__": |
| 94 | + test = [64,34,25,12,22,11,90] |
| 95 | + print(f"冒泡排序结果: {bubble_sort(test.copy())}") |
| 96 | + print(f"插入排序结果: {insertion_sort(test.copy())}") |
| 97 | + print(f"选择排序结果: {selection_sort(test.copy())}") |
| 98 | + print(f"快速排序结果: {quick_sort(test.copy())}") |
| 99 | + print(f"归并排序结果: {merge_sort(test.copy())}") |
| 100 | + print(f"希尔排序结果: {shell_sort(test.copy())}") |
| 101 | + print(f"堆排序结果: {heap_sort(test.copy())}") |
| 102 | + |
0 commit comments