堆相关例子-排序最多移动k距离

题目:

一个几乎有序的数组。几乎有序是指:如果把数组排好序,每个数的移动距离一定不超过K,并且K一定远小于数组长度

分析:

给定的数组有上面的限制条件,根据条件可以分析得到:

对于前0-k个数如果排好序了,那么0位置一定是最小数,因为k位置后面的数无法移动到0位置

所以建立一个小根堆,大小为k+1,用于放置0-k的数

当堆满时,弹出堆顶,此时堆顶是当前需要排序的数列最小值,再将后续一个数入堆

后续数进来,弹出堆顶,再入堆

图解

code

java 复制代码
public static void sortArrayDistanceLessK(int [] arr,int k){
        if(k==0)return;

        //小根堆,大小为k+1
        //将数组前k+1个数入堆
        int heapSize = Math.min(arr.length,k+1);
        PriorityQueue<Integer> minHeap = new PriorityQueue();
        int i = 0;
        for (; i < heapSize; i++) {
            minHeap.add(arr[i]);
        }

        int sortIndex = 0;
        //弹出堆顶,新加入堆
        for(;i<arr.length;i++){
            arr[sortIndex++] = minHeap.poll();
            minHeap.add(arr[i]);
        }
        while (!minHeap.isEmpty()){
            arr[sortIndex++] = minHeap.poll();
        }

    }
相关推荐
NAGNIP2 分钟前
Hugging Face 200页的大模型训练实录
人工智能·算法
Swift社区5 分钟前
LeetCode 457 - 环形数组是否存在循环
算法·leetcode·职场和发展
天远云服13 分钟前
Go 语言实战:构建高并发天远“全国自然人人脸比对 V3”微服务网关
java·大数据·微服务·golang
PPPPickup17 分钟前
easychat项目复盘---管理端系统设置
java·开发语言·前端
挖矿大亨23 分钟前
C++中的this指针
java·开发语言·c++
sheji341629 分钟前
【开题答辩全过程】以 共享单车管理系统为例,包含答辩的问题和答案
java
2401_8772742437 分钟前
2025数据结构实验八:排序
数据结构·算法·排序算法
北北~Simple38 分钟前
接口调不通的情况
java
J2虾虾41 分钟前
空间矢量数据结构及其表达
算法
Neil今天也要学习1 小时前
永磁同步电机无速度算法--永磁同步电机转子位置精确估计的误差抑制方法
算法