堆排序是一个近似完全二叉树的结构,利用堆这种数据结构所设计而成的一种排序算法。
堆 *** 作:
在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种 *** 作:
最大堆调整(swap):将堆的末端子节点作调整,使子节点小于父节点
创建最大堆(adjust_heap):将堆中的所有数据重新进行排序
堆排序(heap_sort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
下面为堆排序 *** 作示例图:
#堆排序代码 def swap(data, root, last): data[root], data[last] = data[last], data[root] #调整父节点 与孩子大小, 制作大顶堆 def adjust_heap(data, par_node, high): new_par_node = par_node j = 2*par_node +1 #取根节点的左孩子, 如果只有一个孩子 high就是左孩子,如果有两个孩子 high 就是右孩子 while j <= high: #如果 j = high 说明没有右孩子,high就是左孩子 if j < high and data[j] < data[j+1]: #如果这儿不判断 j < high 可能超出索引 # 一个根节点下,如果有两个孩子,将 j 指向值大的那个孩子 j += 1 if data[j] > data[new_par_node]: #如果子节点值大于父节点,就互相交换 data[new_par_node], data[j] = data[j], data[new_par_node] new_par_node = j #将当前节点,作为父节点,查找他的子树 j = j * 2 + 1 else: # 因为调整是从上到下,所以下面的所有子树肯定是排序好了的, #如果调整的父节点依然比下面最大的子节点大,就直接打断循环,堆已经调整好了的 break # 开始循环到 root 索引为:0 的第一个根节点, 将所有的根-叶子 调整好,成为一个 大顶堆 def heap_sort(lst): length = len(lst) last = length -1 #最后一个元素的 索引 last_par_node = length//2 -1 while last_par_node >= 0: adjust_heap(lst, last_par_node, length-1) last_par_node -= 1 #每调整好一个节点,从后往前移动一个节点 # return lst while last > 0: #swap(lst, 0, last) lst[0], lst[last] = lst[last],lst[0] # 调整堆让 adjust 处理,最后已经排好序的数,就不处理了 adjust_heap(lst, 0, last-1) last -= 1 return lst #将列表返回 if __name__ == '__main__': a=[1,3,4,5,2,6,9,7,8,0] print(heap_sort(a))
输出示例结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)