每次都取一个最小的数字,放前面,最后实现排序
原始数组:[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)