学习目标:堆排序扩展题目
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k, 并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数组进行排序。
public static void sortedArrDistanceLessK(int[] arr,int k) {
PriorityQueue<Integer> heap=new PriorityQueue<>();//提供的小根堆,每次默认弹出的是最小的数
int index=0;
for (;index<=Math.min(arr.length,k);index++){
heap.add(arr[index]);
}
int i=0;
for (;index<arr.length;i++,index++){
heap.add(arr[index]);
arr[i]=heap.poll();
}
while (!heap.isEmpty()){
arr[i++]=heap.poll();
}
PriorityQueue提供的poll()方法每次默认弹出的是最小的数。在指定的长度k内,将数组加入到小根堆中,加至k长度。后弹出一个最小值,再继续加入一个数至小根堆中,再弹出一个最小值,如此循环至遍历完整个数组的长度后。调整剩下的数,利用poll()方法每次弹出最小值。则实现每个元素移动的距离不超过k并排序。