首页 > 其他分享 >堆排序

堆排序

时间:2023-07-02 19:33:53浏览次数:22  
标签:arr int 堆排序 head new left

求最小的K个数

 

public int[] getLeastNumbers(int[] arr, int k) {
        if(arr.length == 0 || k == 0){
            return new int[0];
        }
        //构建小顶堆
        buildHeap(arr);
        //弹出堆顶 重排序
        int[] rsp = new int[k];
        for(int i = 0; i<k;i++){
            rsp[i] = arr[0];
            swap(arr,0,arr.length-1-i);
            
            execute(arr, 0,arr.length-2-i);
        }
        return rsp;
        
    }

    private void buildHeap(int[] arr){
        for(int i = arr.length/2-1; i>=0;i--){
            execute(arr, i ,arr.length-1);
        }
    }

    private void execute(int[] arr, int head, int right1){
        int left = 2*head +1;
        int right = left +1;
        int min = head;
        if(left <= right1 && arr[left]<arr[min]){
            min = left;
        }
        if(right <= right1 && arr[right]<arr[min]){
            min = right;
        }
        if(min !=  head){
            swap(arr,head,min);
            execute(arr, min ,right1);
        }

    }
    private void swap(int[] arr, int head, int min){
        int a = arr[head];
        arr[head] = arr[min];
        arr[min] = a;
    }
  

  

 

标签:arr,int,堆排序,head,new,left
From: https://www.cnblogs.com/jiangym/p/17521231.html

相关文章

  • 【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排)
    ✔️前言......
  • 【数据结构】选择排序 与 堆排序
    ☑️前言......
  • java常见的排序算法(冒泡排序、选择排序、插入排序、shell排序、归并排序、堆排序、快
    (文章目录)本文简单的介绍了java常见的几种排序。所有的排序均是一个数组由小到大进行排序。一、冒泡排序1、效率表现和适用范围效率O(n²)适用于排序小列表2、算法实现publicvoidbubbleSortArray(int[]a){ intn=a.length; for(inti=1;i<n;i++){ fo......
  • 数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
    packagecom.algorithm.sort;publicclassHeapSortInPlace{privateHeapSortInPlace(){}publicstaticvoidsort(Integer[]arr){intn=arr.length;//注意:我们堆的索引是从0开始的//从(最后一个元素的索引-1)/2开始......
  • 实现堆,堆排序,解决堆的TOPK问题
    这篇博客我会尽我自己的所能讲解堆,同时详细的解释堆中重要的向下和向上调整算法,以及推排序的两种实现方法,和堆的TOPK问题。堆是什么我们之前已经介绍过了树,而堆就是一种完全二叉树。这里我放一张二叉树的图下面我来解释一下满二叉树,和完全二叉树的区别:满二叉树是指除了叶子节点外,每......
  • java排序算法2(简单选择排序、堆排序)
    简单选择排序---不稳定选择排序在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后以此类推,直到所有元素均排序完毕。for(inti=0;i<arr.length;i++){//记录最小值下标位置intmin=i;for(intj=i+1;j<arr.leng......
  • T233293 【模板】堆排序
    题目描述利用堆排序算法将读入的 N 个数从小到大排序后输出。输入格式第 11 行为一个正整数 N,第 22 行包含 N 个空格隔开的正整数 ai​,为你需要进行排序的数,数据保证了 Ai​ 不超过 109109。输出格式将给定的 N 个数从小到大输出,数之间空格隔开,行末换行......
  • 堆排序
    1.堆的定义: 在一颗完全二叉树中,每一个根节点的值均大于(或小于)其左右子树根节点的值,被称为堆。堆分为两种类型:大根堆和小根堆。其中每一棵子树的根节点的值大于等于左右子树节点的值,被称大根堆。如果是每个节点的值均小于等于左右节点的值,被称为小根堆。......
  • 基础算法-堆排序
    思路堆是一种完全二叉树,其中每个节点的值都大于或等于其子节点的值,被称为“大根堆”;或者每个节点的值都小于或等于其子节点的值,被称为“小根堆”。在堆排序中,我们使用的是大根堆,即根节点的值是最大的元素。堆排序的基本思路是:建立一个大根堆。将待排序的序列构建成一个大根堆,......
  • 17.5堆排序实战
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<string>typedefintElemType;typedefstruct{ElemType*elem;//存储元素的起始地址intTableLen;//元素个数}SSTable;voidST_Init(SSTable&ST,intlen){S......