#include <cstdio> #include <iostream> #include <cstring> using namespace std ; int h[100000] ; int n ; void siftdown(int i) //i为要调整的根节点 { int flag = 1,t ; //flag用来标记是否还需要继续调整 while(2*i <= n && flag) //是否至少有左子树 { if(h[2*i]<h[i]) t = 2*i ; else t = i ; if(2*i+1 <= n) //如果也有右子树 { if(h[2*i+1]<h[t]) t = 2*i+1 ; } if(i != t) //如果子树比根节点小 { int temp = h[i] ; h[i] = h[t] ; h[t] = temp ; i = t ; //将i赋值为最小的节点,方便继续操作 } else flag = 0 ; //已经不需要继续调整了 } } void create() //建立堆的函数,多次调用siftdown { for(int i = n/2;i>=1;i--) { siftdown(i) ; } printf("小根堆创建成功\n") ; } int deleteMin() //删除最大的元素 { int t = h[1] ; h[1] = h[n] ; n-- ; siftdown(1) ; return t ; } int main() { printf("输入数字个数\n") ; int num ; scanf("%d",&num) ; n = num ; for(int i = 1 ;i<=num ;i++) //scanf("%d",&h[i]) ; h[i] = 100-i ; create() ; printf("正序排序后如下\n") ; for(int i = 1 ;i<=num;i++) printf("%d ",deleteMin()) ; return 0 ; }
时间: 2024-10-14 07:52:39