自定义结构体:
#define sz 105
typedef struct node{int length;int l[sz];
}SqList;
调整堆的函数:
HeapAdjust函数思路说明:
//目标:将以s为根的子树调整为大根堆
//具体操作:将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就“放下”s
void HeapAdjust(SqList &L, int s, int m)//将以s为根的子树调整为大根堆<=>将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就放下s
{int rc = L.l[s];for(int j = 2*s; j <= m; j *= 2)//j指向s的左子树{if(j<m && L.l[j] < L.l[j+1] ) j+=1;//j指向s的子树中较大的那个if(rc >= L.l[j]) break;//此时接着执行L.l[s] = rc; 便可实现上述目标L.l[s] = L.l[j]; s = j;//将路径上比s大的都往上移动,s往下移动}L.l[s] = rc;
}void CreateHeap(SqList &L)
{int n = L.length;for(int i=n/2; i>0; i--)//从n/2向下取整得到的整数所对应的结果开始,依次进行调整堆的操作{ //关于为什么从n/2开始: 因为在n/2后面的节点都是叶子结点,不需要调整HeapAdjust(L, i, n);}
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
#define sz 105
typedef struct node{int length;int l[sz];
}SqList;void HeapAdjust(SqList &L, int s, int m)//将以s为根的子树调整为大根堆<=>将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就放下s
{int rc = L.l[s];for(int j = 2*s; j <= m; j *= 2)//j指向s的左子树{if(j<m && L.l[j] < L.l[j+1] ) j+=1;//j指向s的子树中较大的那个if(rc >= L.l[j]) break;//此时接着执行L.l[s] = rc; 便可实现上述目标L.l[s] = L.l[j]; s = j;//将路径上比s大的都往上移动,s往下移动}L.l[s] = rc;
}void CreateHeap(SqList &L)
{int n = L.length;for(int i=n/2; i>0; i--)//从n/2向下取整得到的整数所对应的结果开始,依次进行调整堆的操作{ //关于为什么从n/2开始: 因为在n/2后面的节点都是叶子结点,不需要调整HeapAdjust(L, i, n);}
}int main()
{SqList L;L.length = 0;srand(time(NULL));//随机数种子for(int i=1; i<=100; i++){int rand_int = rand()%100;//生成0 ~ 99的随机整数L.l[i] = rand_int;cout<<rand_int<<" "; L.length++;}CreateHeap(L);cout<<"\n"<<"after Adjustment: "<<endl;for(int i=1; i<=L.length; i++ ){cout<<L.l[i]<<" ";}return 0;
}
运行结果示例:
~希望对你有帮助~