// 题目描述
// 已知一个几乎有序的数组。几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离一定不超过k
// k相对于数组长度来说是比较小的。请选择一个合适的排序策略,对这个数组进行排序。
public class SortArrayDistanceLessK {
public static void sortedArrDistanceLessK(int[] arr, int k) {
if (arr == null || arr.length < 2 || k == 0) {
return;
}
int index = 0;
int i = 0;
// 默认是小根堆
PriorityQueue<Integer> heap = new PriorityQueue<>();
while (i <= Math.min(arr.length - 1, k)) {
heap.add(arr[i]);
i++;
}
while (i <= arr.length - 1) {
arr[index] = heap.poll();
index++;
heap.add(arr[i]);
i++;
}
while (!heap.isEmpty()) {
arr[index] = heap.poll();
index++;
}
}
}
// 时间复杂度使NlogK