堆排序(小根堆)

来源:互联网 发布:vb九九乘法表代码简单 编辑:程序博客网 时间:2024/06/05 15:55
#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 ;}

2 0
原创粉丝点击