堆排序
2017-04-12 13:58
225 查看
利用二叉树的特性实现堆排序
在对堆进行删除时,将对应节点值,变为最小值,然后调用Max_Heapfiy函数从新排序即可,插入则想加入一个最小值,保证原堆是最大堆,然后逐层比较节点和父节点大小,判断是否交换
#include<iostream> using namespace std; //节点从0开始所以会多1 int left(int i) { return i * 2 + 1; } int right(int i) { return i * 2 + 2; } //使得节点i及其子节点都是最大堆 void Max_Heapfiy(int *A, int length, int i) { int Right = right(i), Left = left(i), largest = i; if (Left < length && A[Left] > A[largest]) { largest = Left; } if (Right < length && A[Right] > A[largest]) { largest = Right; } if (largest != i) { int temp = A[i]; A[i] = A[largest]; A[largest] = temp; Max_Heapfiy(A, length, largest); } } void Build_Max_Heap(int *A, int length) { //从最后一个非叶子节点开始,到根节点,因为Max_Heapfiy调用时必须保证子节点是最大堆 for (int i = (length - 1) / 2; i >= 0; i--) { Max_Heapfiy(A, 5, i); } } void px(int *A, int length) { Build_Max_Heap(A, length); for (int i = length - 1; i >= 1; i--) { int temp = A[i]; A[i] = A[0]; A[0] = temp; Max_Heapfiy(A, i, 0); } } int main() { int a[5] = {5,3,2,1,4}; px(a, 5); system("pause"); return 0; }
在对堆进行删除时,将对应节点值,变为最小值,然后调用Max_Heapfiy函数从新排序即可,插入则想加入一个最小值,保证原堆是最大堆,然后逐层比较节点和父节点大小,判断是否交换
相关文章推荐
- 寻找数组中前K个最小的数(Kth smallest element)---(堆排序的应用)
- java实现堆排序
- 堆排序
- 内部排序之直接选择排序、堆排序
- java 实现堆排序
- [堆排序之一]图文说明,快速理解
- HDU 1040(As Easy As A+B) 堆排序练习
- Java学习资料-Java常用算法-堆排序
- algorithm: heap sort in python 算法导论 堆排序
- 经典排序之堆排序
- 堆排序,C++模板编程
- 堆排序
- 浅谈算法和数据结构: 五 优先级队列与堆排序
- 算法导论—堆排序(python)
- 堆(堆排序)
- 漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析
- 堆排序
- (高效率排序算法三)堆排序
- 白话经典算法系列之七 堆与堆排序
- Java排序算法总结之堆排序