SortArrayDistanceLessK

这篇博客介绍了一种针对几乎有序数组的排序算法,利用优先级队列(PriorityQueue)来实现。在数组中,元素的移动距离不超过K,K相对较小。算法思路是初始化一个大小为K+1的优先级队列,然后逐步添加数组元素并移除最小值,确保排序过程中的元素移动不超过K次。源代码展示了具体的实现细节。
摘要由CSDN通过智能技术生成

[Question]

已知一个几乎有序的数组,几乎有序是指如果把数组排好序的话,每个元素移动的距离可以不超过K,并且K相对于数组来说比较小。

[Idea]

使用优先级队列结构 PriorityQueue length=K+1
首先将数组前"K+1"个数add进 PriorityQueue 
其次循环 add 数组下一个数 并 poll up 数组第一个数

[Source code]

import java.util.PriorityQueue;

public class code04_SortArrayDistanceLessK {

    public static void sortArrayDistanceLessK(int[] array, int k) {
        if (array == null || array.length < 2) {
            return;
        }
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        int index = 0;
        for (; index < Math.min(array.length - 1, k); index++) {
            heap.add(array[index]);
        }
        int i = 0;
        for (; index < array.length; i++, index++) {
            heap.add(array[i]);
            array[i] = heap.poll();
        }
        while (!heap.isEmpty()) {
            array[i++] = heap.poll();
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值