排序算法

    xiaoxiao2022-07-08  168

    选择排序

    每次都取一个最小的数字,放前面,最后实现排序

    原始数组:[10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

    第一轮:[0, 1, 2, 9, 4, 10, 8, 6, 7, 3, 5]

    第二轮:[0, 1, 2, 9, 4, 10, 8, 6, 7, 3, 5]

    第三轮:[0, 1, 2, 9, 4, 10, 8, 6, 7, 3, 5]

    第四轮:[0, 1, 2, 3, 4, 10, 8, 6, 7, 9, 5]

    第五轮:[0, 1, 2, 3, 4, 10, 8, 6, 7, 9, 5]

    第六轮:[0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10]

    第七轮:[0, 1, 2, 3, 4, 5, 6, 8, 7, 9, 10]

    第八轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    第九轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    第十轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    def choose_sort(arr): n = len(arr) for i in range(n-1): min_index = i for j in range(i+1, n): if arr[j] < arr[min_index]: min_index = j arr[min_index], arr[i] = arr[i], arr[min_index]

    插入排序

    取出数字,然后插入到前面已经排好序的序列中去。

    原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

    第1轮: [1, 10, 2, 9, 4, 0, 8, 6, 7, 3, 5]

    第2轮: [1, 2, 10, 9, 4, 0, 8, 6, 7, 3, 5]

    第3轮: [1, 2, 9, 10, 4, 0, 8, 6, 7, 3, 5]

    第4轮: [1, 2, 4, 9, 10, 0, 8, 6, 7, 3, 5]

    第5轮: [0, 1, 2, 4, 9, 10, 8, 6, 7, 3, 5]

    第6轮: [0, 1, 2, 4, 8, 9, 10, 6, 7, 3, 5]

    第7轮: [0, 1, 2, 4, 6, 8, 9, 10, 7, 3, 5]

    第8轮: [0, 1, 2, 4, 6, 7, 8, 9, 10, 3, 5]

    第9轮: [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 5]

    第10轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    def insert_sort(arr): n = len(arr) for i in range(n-1): cur = i + 1 # 当前待插入元素的索引 j = i pos = 0 while j >= 0: if arr[cur] > arr[j]: pos = j + 1 # 待插入位置 break j -= 1 # 开始插入 tmp = arr[cur] k = cur while k > pos: arr[k] = arr[k-1] k -= 1 arr[pos] = tmp

    冒泡排序

    每次经过一轮冒泡将最大的数字沉到最右端。

    原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

    第1轮: [1, 2, 9, 4, 0, 8, 6, 7, 3, 5, 10]

    第2轮: [1, 2, 4, 0, 8, 6, 7, 3, 5, 9, 10]

    第3轮: [1, 2, 0, 4, 6, 7, 3, 5, 8, 9, 10]

    第4轮: [1, 0, 2, 4, 6, 3, 5, 7, 8, 9, 10]

    第5轮: [0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10]

    第6轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    第7轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    第8轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    第9轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    第10轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    def bubble_sort(arr): n = len(arr) for i in range(0, n-1): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j]

    合并排序

    利用分治的思想,先对左右两个子区域分别进行排序,然后使用线性表合并的方法,将左右两个子区域合并到临时数组,最后拷贝回去。

    原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

    第1轮: [1, 10, 2, 9, 4, 0, 8, 6, 7, 3, 5], start=0, end=1

    第2轮:[1, 2, 10, 9, 4, 0, 8, 6, 7, 3, 5], start=0, end=2

    第3轮:[1, 2, 10, 4, 9, 0, 8, 6, 7, 3, 5], start=3, end=4

    第4轮:[1, 2, 10, 0, 4, 9, 8, 6, 7, 3, 5], start=3, end=5

    第5轮:[0, 1, 2, 4, 9, 10, 8, 6, 7, 3, 5], start=0, end=5

    第6轮:[0, 1, 2, 4, 9, 10, 6, 8, 7, 3, 5], start=6, end=7

    第7轮:[0, 1, 2, 4, 9, 10, 6, 7, 8, 3, 5], start=6, end=8

    第8轮:[0, 1, 2, 4, 9, 10, 6, 7, 8, 3, 5], start=9, end=10

    第9轮:[0, 1, 2, 4, 9, 10, 3, 5, 6, 7, 8], start=6, end=10

    第10轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], start=0, end=10

    def merge_sort(arr): n = len(arr) merge(0, n-1, arr) def merge(start, end, arr): if start == end: return mid = (start + end) // 2 merge(start, mid, arr) merge(mid + 1, end, arr) tmp = [0]*(end - start + 1) index = 0 p = start q = mid + 1 while p <= mid and q <= end: if arr[p] < arr[q]: tmp[index] = arr[p] index += 1 p += 1 else: tmp[index] = arr[q] index += 1 q += 1 while p <= mid: tmp[index] = arr[p] index += 1 p += 1 while q <= end: tmp[index] = arr[q] index += 1 q += 1 for index in range(start, end + 1): arr[index] = tmp[index - start]

    快速排序

    原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

    [5, 1, 2, 9, 4, 0, 8, 6, 7, 3, 10], key=10

    [3, 1, 2, 0, 4, 5, 8, 6, 7, 9, 10], key=5

    [0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10], key=3

    [0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10], key=0

    [0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10], key=1

    [0, 1, 2, 3, 4, 5, 7, 6, 8, 9, 10], key=8

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], key=7

    def quick_sort(arr): n = len(arr) quick(0, n-1, arr) def quick(start, end, arr): if start >= end: # 当只有两个元素的时候,left+1可能会超出end return key = arr[start] left = start right = end while left < right: while right > left and arr[right] >= key: right -= 1 if left < right: arr[left] = arr[right] while right > left and arr[left] <= key: left += 1 if left < right: arr[right] = arr[left] arr[left] = key quick(start, left - 1, arr) quick(left + 1, end, arr)
    最新回复(0)