“ Ctrl AC!一起 AC!”
目录
堆
堆是一颗完全二叉树,其中树的每个结点都不小于其左右孩子的称为最大堆,反之称为最小堆。
【以下以最大堆为例】
定义数组表示堆:
const int maxn=100;
//heap为堆,n为元素个数
int heap[maxn],n=10;
向下调整:
//low为欲调整的下标,high为最后一个元素的下标
void downAdjust(int low,int high){
int i=low,j=i*2;
while(j<=high){
if(j+1<=high&&heap[j+1]>heap[j]){
j=j+1;
}
if(heap[j]>heap[i]){
swap(heap[j],heap[i]);
i=j; //i继续跟着原来的low点,j继续充当左孩子
j=i*2;
}
else{
break;
}
}
}
建堆:
从n/2枚举到1,保证枚举的不是叶结点,并且最大的数能到达最顶端。
void creatHeap(){
for(int i=n/2;i>=1;i--){
downAdjust(i,n);
}
}
删除堆顶元素:
将数组的最后一个数代替掉堆顶的元素,然后总个数减一,并向下调整堆顶元素至合适位置。
void deleteTop(){
heap[1]=heap[n--];
downAdjust(1,n);
}
向上调整:
//其中low一般为1,表示第一个元素,high表示欲调整的元素
void upAdjust(int low,int high){
int i=high,j=i/2;
while(j>=low){
if(heap[j]<heap[i]){
swap(heap[j],heap[i]);
i=j;
j=i/2;
}
else{
break;
}
}
}
插入元素:
在数组末尾加新元素,然后通过向上调整,将其调至合适位置。
void insert(int x){
heap[++n]=x;
upAdjust(1,n);
}
堆排序
取堆顶元素并删除调整,按顺序放入容器就变成有序的了。
具体讲就是,取出堆顶元素,用堆的最后一个元素替换掉它,然后对堆顶向下调整至合适位置,保持堆的性质。
void heapSort(){
createHeap();
for(int i=n;i>1;i--){
printf("%d\n",heap[1]);
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
printf("%d\n",heap[1]);//输出最后一个
}
感谢阅读!!!
“ Ctrl AC!一起 AC!”
掌握堆排序:从原理到实现详解
1597

被折叠的 条评论
为什么被折叠?



