创建最大堆

来源:互联网 发布:重庆软件学校 编辑:程序博客网 时间:2024/05/22 15:29
#include<iostream>#define LEFT(i)  (i<<2)#define RIGHT(i)  ((i<<2)+1)using namespace std;void swap(int& small, int& big){     int temp = small;     small = big;     big = temp;}void heap_adjust(int arr[], int root, int size){int leftchild = LEFT(root);int rightchild = RIGHT(root);int largest;if ( leftchild <= size && arr[leftchild] > arr[root])largest = leftchild;elselargest = root;if ( rightchild <= size && arr[rightchild] > arr[root])largest = rightchild ;/*| 上面已经把父节点arr[root]和左右儿子节点做大小比较(arr[leftchild],arr[rightchild])| 当arr[leftchild]或arr[rightchild]大于父节点时,就交换他们的位置,| 此时这棵树就是最大堆||但还要确保以孩子节点为根的子树也是最大二叉树堆,所以依次比较,也就是递归比较*/if ( largest != root ){swap (arr[root], arr[largest]);heap_adjust(arr, largest, size);}}/* |序列中从arr[size/2+1]开始一直到arr[size-1] |在映射到完全二叉树的过程中都为叶子节点,即都为一颗独立的二叉树 |且都是只包含一个节点(即自己本身)的完全二叉树 | |所以在建树的时候,从arr[size/2 : 0]反向建树, |这样可以确保在对构建完整的二叉树从上至下,从左至右,所遵循的次序 |与序列中从0 -> (size-1)的循序是对应的。*/void build_heap(int arr[], int size){     for (int i = size/2; i >= 0; i-- )         heap_adjust(arr, i, size);}//创建最大堆int main(){    const int size = 10;    int iarray[size] = {15,3,4,9,25,60,87,88,92,5};    build_heap(iarray,size-1);        for (int i = 0; i < size; i++ )    cout << iarray[i] << " ";        cin.get();    return 0;}

0 0
原创粉丝点击