版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/88121088
Python 实现快排、堆排
1、快排
原理:(升序)
- 选取数组的首个元素做为中间值,缓存这个中间值,该位置变为空;
- 从右到左和中间值对比,找到第一个小于中间值的元素,把该值放到左边的空位,该位置变为空;
- 从左到右和中间值对比,找到第一个大于中间值的元素,把该值放到右边的空位,该位置变为空;
- 重复步骤2和3,直到左右空位相交,然后把缓存的中间值填入该位;
- 从第4步骤的左右空位相交位为界,分左右两边重复1-4步骤,直到需要排序数组的长度≤1;
程序代码:
# 快排
def quick_sort(A, l, r):
if l < r:
pivot = A[l]
left = l
right = r
while left < right:
while A[right] > pivot and left < right:
right -= 1
# 左右不能相等,相等的话会进行移动,导致数组越界
if left < right:
A[left] = A[right]
left += 1
while A[left] <= pivot and left < right:
left += 1
if left < right:
A[right] = A[left]
right -= 1
A[left] = pivot
quick_sort(A, l, left-1)
quick_sort(A, left+1, r)
if __name__ == '__main__':
S = [0, 2, 1, 6]
quick_sort(S, 0, 3)
print(S)
2、堆排
原理(用数组表示完全二叉树的层序,最小堆):
- 从最后一个叶子节点的父节点开始,比较该节点与子节点的大小;
- 如果父节点是最小值,继续比较前面的节点;如果父节点不是最小值,父节点与最小值节点交换位置,并且考虑该变换对最小值节点的子节点的影响;
- 直到比较到根节点
程序代码:
# 堆排
def heap_sort(A):
for i in range((len(A) - 1) // 2, -1, -1):
while i < len(A):
# 子节点与父节点的位置关系
left, right = i * 2 + 1, i * 2 + 2
min_pos = i
if (left < len(A)) and (A[left] < A[min_pos]):
min_pos = left
if (right < len(A)) and (A[right] < A[min_pos]):
min_pos = right
# 如果最小值的位置改变了,需要考虑这个改变带来的影响
if min_pos != i:
A[i], A[min_pos] = A[min_pos], A[i]
i = min_pos
else:
break
if __name__ == '__main__':
S = [4, 3, 2, 1]
heap_sort(S)
print(S)
GOOD LUCK!