本博客是建立在已经掌握原理的基础上来方便快速查阅代码的,原理见十大排序算法(Python实现)。
快速排序
def partition(arr,low,high):
'''分割数组
'''
i = ( low-1 ) # 最小元素索引
pivot = arr[high] # 可以将任意值作为初始基准值,这里为了方便采取首元素或者尾元素
for j in range(low , high):
# 当前元素小于或等于 pivot
if arr[j] <= pivot:
i = i+1
arr[i],arr[j] = arr[j],arr[i]
arr[i+1],arr[high] = arr[high],arr[i+1]
return i+1
def quick_sort(arr,low,high):
if low < high:
pi = partition(arr,low,high)
quick_sort(arr, low, pi-1)
quick_sort(arr, pi+1, high)
return arr
arr = [3,1,4,5,6]
quick_sort(arr,0,len(arr)-1)
print(arr)
选择排序
def selection_sort(arr):
'''选择排序
'''
for i in range(len(arr) - 1):
# 记录最小数的索引
min_index = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
# i 不是最小数时,将 i 和最小数进行交换
if i != min_index:
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
冒泡排序
def bubble_sort(arr):
'''冒泡排序
'''
for i in range(1, len(arr)):
found = False # 定义是否发现逆序的flag
for j in range(0, len(arr)-i):
if arr[j] > arr[j+1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
found = True
if not found:
break
return arr
计数排序
def counting_sort(arr):
'''只适用于整数数组
'''
bucket_len = max(arr)+1 # 新数组长度为arr中的最大值+1
bucket = [0]*bucket_len
# 开始计数
for i in range(len(arr)):
if not bucket[arr[i]]:
bucket[arr[i]]=0
bucket[arr[i]]+=1
# 按顺序重新填入
sorted_index = 0
for j in range(bucket_len):
while bucket[j]>0:
arr[sorted_index] = j
sorted_index+=1
bucket[j]-=1
return arr
归并排序
def merge(left,right):
'''合并
'''
res = []
while left and right:
if left[0] <= right[0]:
res.append(left.pop(0)) # pop(0) 弹出首元素
else:
res.append(right.pop(0))
while left:
res.append(left.pop(0))
while right:
res.append(right.pop(0))
return res
def merge_sort(arr):
import math
if(len(arr)<2):
return arr
middle = len(arr)//2
left, right = arr[0:middle], arr[middle:]
return merge(merge_sort(left), merge_sort(right))
arr = [3,1,2,4]
print(merge_sort(arr))