本来想写一篇关于堆排序的详细教程的,发现本身不会画图,QAQ。并且也不必定会画的比别人好看多少,尴尬的我上个人代码把。html
我简单的说一下思路:咱们构建的堆结构是逻辑结构。若是列表须要升序排列就构建一个大顶堆,降序就小顶堆。大顶堆的定义是该节点比其左右子节点都大,小顶堆相反。第一步构建完大顶堆,堆顶元素就是列表中最大元素,第二步把堆顶元素和第一个元素交换位置,第三步再调整成大顶堆,循环第二步和第三步。直到列表有序。堆排序是不稳定的(不稳定:不保证列表中两个相等的数的先后位置在排序后和排序前同样)。spa
1 import math 2 3 4 def sort(arr): 5 # 构建大顶堆, math.floor(), 向下取整, 由于构建大顶堆是从最后一个非叶子节点开始的 6 for i in range(math.floor(len(arr) / 2) - 1, -1, -1): 7 adjust_heap(arr, i, len(arr)) 8 # 调整 和 把堆顶这个最大数和最后一个数交换 9 for i in range(len(arr) - 1, 0, -1): 10 arr[i], arr[0] = arr[0], arr[i] 11 adjust_heap(arr, 0, i) 12 13 14 def adjust_heap(arr, i, length): 15 ''' 16 调整,每一次传过来的 i 节点及其子节点调整成大顶堆, 17 若是不调其子节点有可能致使其子节点不是一个大顶堆 18 ''' 19 temp = arr[i] 20 k = 2 * i + 1 21 while k < length: 22 if k + 1 < length and arr[k] < arr[k + 1]: 23 k += 1 24 if arr[k] > temp: 25 arr[i] = arr[k] 26 i = k 27 k = k * 2 + 1 28 arr[i] = temp 29 30 31 test_list = [9, 8, 7, 6, 5, 4, 8, 2, 1] 32 sort(test_list) 33 print(test_list)
http://www.javashuo.com/article/p-wtyhbkog-dg.html 这一篇文章教的挺详细的,你们不懂的能够看一看。code