二叉堆是一种数据结构。
___________________________________________________________________________________________________________________________________
堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全二叉树,树中每个结点与数组中存放该结点值的那个元素对应。
二叉堆有两种:最大堆和最小堆(小根堆)。
堆的高度
堆可以被看成是一棵树,结点在堆中的高度可以被定义为从本结点到叶子结点的最长简单下降路径上边的数目;定义堆的高度为树根的高度。我们将看到,堆结构上的一些基本操作的运行时间至多是与树的高度成正比,为O(lgn)。
最大堆:所有节点的子节点比其自身小的堆。
最小堆:所有节点的子节点比其自身大的堆。
堆排序:堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单
在堆排序算法中,使用的是最大堆,最小堆通常在构造优先级队列时使用。
1 #include<iostream> 2 using namespace std; 3 4 5 //堆化,保持堆的性质 6 //Max_heapify 让a[i]在最大堆中“下降”, 7 //使以i为根的子树成为最大堆。 8 void Max_heapify(int *a, int i, int size) 9 { 10 int lt = i << 1, rt = (i << 1) + 1;//算法导论上推荐的方法是用位移 11 // int lt = 2*i, rt = 2*i+1; 12 int largest; 13 if(lt <= size && a[lt] > a[i]) 14 largest = lt; 15 else 16 largest = i; 17 if(rt <= size && a[rt] > a[largest]) 18 largest = rt; 19 if(largest != i) //如果不符合堆的性质,则进行交换,且继续子节点 20 { 21 int temp = a[i]; 22 a[i] = a[largest]; 23 a[largest] = temp; 24 Max_heapify(a,largest,size); 25 } 26 } 27 28 //自底而上地调用Maxheapify来将一个数组 变成一个最大堆。 29 void BuildMaxheap(int *a, int size) //建立堆 30 { 31 for(int i = size/2; i>=1; --i) 32 Max_heapify(a,i,size); 33 } 34 35 36 //堆排序算法 37 //初始调用BuildMaxheap将a[i.....size]变成最大堆 38 //因为数组最大元素在a[1],则可以通过将a[i] 与 a[size]互换达到正确位置 39 //新的根元素破坏了最大堆的性质,所以调用Max_heapify调整 40 //使a[1......size-1]成为最大堆,a[1]又是最大的元素了, 41 //将a[1] 与 a[size-1] 调换位置 42 //反复调用Heapfiy,使整个数组从小到大排序 43 44 // 注意: 交换只是破坏了以a[1]为根的二叉树最大堆性质,它的左右子二叉树还是具备最大堆性质。 45 // 这也是为何在BuildMaxHeap时需要遍历size/2到1的结点才能构成最大堆,而这里只需要堆化a[1]即可。 46 void HeapSort(int *a, int size) 47 { 48 BuildMaxheap(a,size); 49 int len = size; 50 for( ; len >= 2 ; ) 51 { 52 int temp = a[1]; 53 a[1] = a[len]; 54 a[len] = temp; 55 len--; 56 Max_heapify(a,1,len); 57 } 58 } 59 60 61 int main() 62 { 63 int i,a[11]; 64 for(i=1;i<=10;i++) 65 scanf("%d",&a[i]); 66 HeapSort(a,10); 67 for(i=1;i<=10;i++) 68 printf("%d ",a[i]); 69 return 0; 70 }
1 http://blog.csdn.net/made_in_chn/article/details/5473871