堆结构和堆排序

java 复制代码
import java.io.*;
public class Main{
    public static int MAXN = 100001;
    public static int[] arr = new int[MAXN];
    public static int n;

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
        StreamTokenizer in = new StreamTokenizer(br);

        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        in.nextToken();
        n = (int)in.nval;

        for(int i = 0;i < n;i++){
            in.nextToken();
            arr[i] = (int)in.nval;
        }

        //堆排序
         heapSort1(arr);
		// heapSort2(arr);
        //输出排序后的数组
        for(int i = 0;i< n-1;i++){
            out.print(arr[i] +" ");
        }
        out.print(arr[n-1]);

        out.flush();
        out.close();
        br.close();
    }


    //heapInsert (i位置的数,向上调整大根堆)
    public static void heapInsert(int i){
        while(arr[i] > arr[(i-1)/2]){
            swap(arr,i,(i-1)/2);
            i = (i-1)/2;
        }
    }   
    //heapify (i位置的数,向下调整大根堆)
    //当前堆的大小为size
    public static void heapify(int i,int size){
        int l = i*2 +1;
        while(l<size){
             //比较i的左孩子2i+1 和 右孩子2i+2,哪个大,选出更大的孩子下标
           int best = (l + 1)<size && arr[l] < arr[l+1] ? (l+1) : l;

            //再比较i和更大的孩子之间哪个大
            best = arr[i] >arr[best] ? i : best;
            if(best == i){
                break;
            }
            swap(arr ,i , best);
            i = best;
            l = i*2 +1;  
        }
    }
    
    //heapSort1为从顶到底建立大根堆然后排序
    //从顶到底建立大根堆 O(n*logn)
    //依次弹出堆内最大值并排好序O(n*logn)
    //整体时间复杂度O(n*logn)
    public static void heapSort1(int arr[]){
        for(int i=0;i<n;i++){
            heapInsert(i);
        }
        int size = n;
        while(size>1){
            swap(arr,0,--size);
            heapify(0,size);
        }
    }
    //heapSort2为从底到顶建堆然后排序
    //从底到顶建立大根堆O(n)
    //依次弹出堆内最大值并排好序 O(n*logn)
    //整体时间复杂度O(n*logn)
    public static void heapSort2(int arr[]){
        for(int i = n -1;i>=0;i--){
            heapify(i,n);
        }
        int size = n;
        while (size > 1) {
			swap(arr,0, --size);
			heapify(0, size);
		}
    }

    //swap函数
    public static void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
相关推荐
captain37612 分钟前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
2601_9707038333 分钟前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你021433 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
步行cgn1 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
ZhengEnCi2 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
lgcgkCQ2 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog2 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老2 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
Flynn Liang2 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!2 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法