import java.util.PriorityQueue;
/**
* 已知一個幾乎有序的數組,如果排好序,每個元素的移動距離不超過k,並且k相對於數組長度是比較小的。
* 選擇一種合適的算法
*/
public class SortArrayDistanceLessK {
public static void sortArrayDistanceLessK(int[] arr, int k) {
// 非法或者已知排好序
if (k == 0) {
return;
}
// 默認 小根堆/最小堆
PriorityQueue<Integer> heap = new PriorityQueue();
// 先把前面k個數加入堆,已知排好序的第一個節點必然在前面k個數中
int index = 0;
while (index <= Math.min(arr.length - 1, k - 1)) {
heap.add(arr[index++]);
}
// 從堆中彈出最小值,依次放入數組,則最終結果就是排好序的 小根堆/最小堆
int i = 0;
for (; i < arr.length; i++, index++) {
arr[i] = heap.poll();
heap.add(arr[index]);
}
while (!heap.isEmpty()) {
arr[i++] = heap.poll();
}
}
}
/* 如有意見或建議,歡迎評論區留言;如發現代碼有誤,歡迎批評指正 */