堆排序
堆排序的思想是将数据以二叉树的方式进行排列放置,其实重点在于将每次都将当前的结点与孩子结点进行对比,如果孩子结点大于双亲结点则,将这个孩子结点替代这个双亲结点,以总结点数//2=n,n,n-1,n-2,n-3,…1,,注意如果替换了之后,还有孩子结点还要继续替换。直接看代码:
def heap_sort(a):
a = [0] + a
b = a
for i in range(len(a), 1, -1):
a = heap_adjust(a[0:i])
a[1], a[len(a) - 1] = a[len(a) - 1], a[1]
b[i - 1] = a[-1]
return b[1:len(b) + 1]
def heap_adjust(a):
num = len(a) - 1
num_half = num // 2
for i in range(num_half, 0, -1):
temp = heap_change(a, i)
while temp * 2 < num:
temp = heap_change(a, temp)
return adef heap_change(a, i):
if 2 * i + 1 > len(a) - 1:
if a[2 * i] > a[i]:
a[i], a[2 * i] = a[2 * i], a[i]
return len(a) - 1
else:
return 2 * i
else:
if a[2 * i + 1] > a[i] or a[2 * i] > a[i]:
if a[2 * i + 1] > a[2 * i]:
a[i], a[2 * i + 1] = a[2 * i + 1], a[i]
return 2 * i + 1
else:
a[i], a[2 * i] = a[2 * i], a[i]
return 2 * i
else:
return len(a) - 1
a = [5, 1, 9, 3, 73, 24, 32, 88, 0, 22, 64, 4, 4, 8, 54, 0, 6, 2]
print("排序前", a)
a = heap_sort(a)
print("排序后", a)