堆排序
2017-01-30 22:21
239 查看
预备知识:大顶堆,小顶堆,完全二叉树
如果要从小到大排序。就构成大顶堆
如果要从大到小排序,就构成小顶堆
构造大顶堆代码:
构造小顶堆代码:
如果要从小到大排序。就构成大顶堆
如果要从大到小排序,就构成小顶堆
构造大顶堆代码:
#!/usr/bin/python #coding: utf-8 def Heap_Sort(res): def Heap_Adujst(res, root, n): while True: child = root * 2 # 当前结点不存在孩子结点 if child > n: break # 使child指向最大的孩子的下标 if child + 1 <= n and res[child] < res[child + 1]: child += 1 if res[child] > res[root]: res[root], res[child] = res[child], res[root] root = child else: break # 构造大顶堆 # 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素 for i in range((len(res) - 1) / 2, -1, -1): Heap_Adujst(res, i, len(res) - 1) # 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 for i in range(len(res) - 1, 0, -1): # 把第一个元素和当前的最后一个元素交换 # 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的 res[i], res[0] = res[0], res[i] # 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 Heap_Adujst(res, 0, i - 1) return res if __name__ == "__main__": res = [i for i in range(9, -1, -1)] res = Heap_Sort(res) print res
构造小顶堆代码:
#!/usr/bin/python #coding: utf-8 def Heap_Sort(res): def Heap_Adujst(res, root, n): while True: child = root * 2 # 当前结点不存在孩子结点 if child > n: break # 使child指向最小的孩子的下标 if child + 1 <= n and res[child] > res[child + 1]: child += 1 if res[child] < res[root]: res[root], res[child] = res[child], res[root] root = child else: break # 构造小顶堆 # 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素 for i in range((len(res) - 1) / 2, -1, -1): Heap_Adujst(res, i, len(res) - 1) # 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 for i in range(len(res) - 1, 0, -1): # 把第一个元素和当前的最后一个元素交换 # 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的 res[i], res[0] = res[0], res[i] # 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 Heap_Adujst(res, 0, i - 1) return res if __name__ == "__main__": res = range(10) res = Heap_Sort(res) print res