題目:已知一個幾乎有序的數組,幾乎有序是指,如果把數組排好順序的話,每個元素移動的距離一定不超過k,並且k相對於數組長度來說比較小,請選擇一個合適的排序策略,對這個數組進行排序
package com.inspire.chapter4;
import java.util.PriorityQueue;
public class SortArrayDistanceLessK {
public static void main(String[] args) {
int[] arr = { 5, 4, 3, 2, 1, 6, 7, 10, 9, 8 };
int k = 5;
sortedArrDistanceLessK(arr, k);
printf(arr);
}
private static void sortedArrDistanceLessK(int[] arr, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
// 將數組中前k個元素放進堆中
int index = 0;
for (; index < Math.min(arr.length - 1, k); index++) {
heap.add(arr[index]);
} // 前k個元素的堆結構已經調整好了
int i = 0;
for (; index < arr.length; index++, i++) {
arr[i] = heap.poll();// 彈出堆頂,放進數組第i個位置
heap.add(arr[index]);// 將第index個元素放進堆中
}
while (!heap.isEmpty()) {
arr[i++] = heap.poll();
}
}
private static void printf(int[] arr) {
for (int i : arr) {
System.out.print(i + " ");
}
}
}