堆排序是通过构建一个最大堆实现的。
def sift_down(array, root, end):
# 从root开始向下调整元素
while True:
child = 2*root + 1
if child > end:
break
if child + 1 <= end and array[child] < array[child+1]:
child += 1
if array[root] < array[child]:
array[root], array[child] = array[child], array[root]
root = child
else:
break
def heap_sort(array, l, r):
# 从非叶子节点开始调整成最大堆
for i in range(len(array)//2-1, -1, -1):
sift_down(array, i, r)
# 进行堆排序
for i in range(r, 0, -1):
array[0], array[i] = array[i], array[0]
sift_down(array, 0, i-1)
test = [2,3,4,5,1,2,6,7,4,3,2]
heap_sort(test, 0, len(test)-1)
print(test)
# [1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7]
快速排序是先找到一个位置,使得该位置左边的元素都比它小,该位置右边的元素都比它大;
然后递归地对左边子序列和右边子序列这样排序。
def quick_sort(array, l, r):
# 快速排序
if l < r:
p = partition(array, l, r)
quick_sort(array, l, p-1)
quick_sort(array, p+1, r)
def partition(array, l, r):
# 划分函数
x = array[r]
i = l - 1
for j in range(l, r):
if array[j] < x:
i += 1
array[i], array[j] = array[j], array[i]
array[i+1], array[r] = array[r], array[i+1]
return i + 1
test = [2,3,4,5,1,2,6,7,4,3,2]
quick_sort(test, 0, len(test)-1)
print(test)
# [1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7]