首页 > 代码库 > 堆排序(小根堆)
堆排序(小根堆)
#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 ; }
堆排序(小根堆)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。