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