C语言算法速查手册

JerryXia 发表于 , 阅读 (13)

大根堆: a[i]>=a[i*2+1] && a[i]>=a[2*i+2], 注意不要求 左右子树 的大小关系

// 假设 i 节点之后的元素都排好序, 将 i 节点插入到堆中void sift(int* a, int n, int i){    int j,t;    t=a[i]; j = 2*i+1;    while(j<n) {        if(j<n-1 && a[j]<a[j+1]) j++; // 左右子节点中较大的节点        if(t<a[j]){            a[i]=a[j]; i=j; j = 2*i+1; // 比子节点小, 下移一层        }else break;    }    a[i] = t;}void heapSort(int* a,int n){    int i,t;    // 构建初始堆, 最大需要排序的节点为 2*i+1 <= n-1    for(i=(n>>1)-1;i>=0;i--) sift(a,n,i);    for(i=1;i<n;i++){        t=a[0]; a[0] = a[n-i]; a[n-i] = t; // 将最大的元素移动到末尾, 继续维护剩下的堆        sift(a,n-i,0);    }