zoukankan      html  css  js  c++  java
  • 堆排序(小根堆)

    #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("小根堆创建成功
    ") ;
    }
    
    int deleteMin()   //删除最大的元素
    {
        int t = h[1] ;
        h[1] = h[n] ;
        n-- ;
        siftdown(1) ;
        return t ;
    }
    
    int main()
    {
        printf("输入数字个数
    ") ;
        int num ;
        scanf("%d",&num) ;
        n = num ;
        for(int i = 1 ;i<=num ;i++)
            //scanf("%d",&h[i]) ;
            h[i] = 100-i ;
        create() ;
        printf("正序排序后如下
    ") ;
        for(int i = 1 ;i<=num;i++)
            printf("%d ",deleteMin()) ;
        return  0 ;
    }
    

  • 相关阅读:
    Hadoop学习资料收集
    sed使用详解
    shell编程001
    电影《无法触碰》
    正则表达式
    I/O重定向与管道
    bash基础知识
    用户权限模型
    Linux文件管理常用命令
    根文件系统详解
  • 原文地址:https://www.cnblogs.com/emoji/p/4436853.html
Copyright © 2011-2022 走看看