一个几乎有序的数组。几乎有序是指:如果把数组排好序,每个数的移动距离一定不超过K,并且K一定远小于数组长度
给定的数组有上面的限制条件,根据条件可以分析得到:
对于前0-k个数如果排好序了,那么0位置一定是最小数,因为k位置后面的数无法移动到0位置
所以建立一个小根堆,大小为k+1,用于放置0-k的数
当堆满时,弹出堆顶,此时堆顶是当前需要排序的数列最小值,再将后续一个数入堆
后续数进来,弹出堆顶,再入堆

- public static void sortArrayDistanceLessK(int [] arr,int k){
- if(k==0)return;
-
- //小根堆,大小为k+1
- //将数组前k+1个数入堆
- int heapSize = Math.min(arr.length,k+1);
- PriorityQueue
minHeap = new PriorityQueue(); - int i = 0;
- for (; i < heapSize; i++) {
- minHeap.add(arr[i]);
- }
-
- int sortIndex = 0;
- //弹出堆顶,新加入堆
- for(;i
- arr[sortIndex++] = minHeap.poll();
- minHeap.add(arr[i]);
- }
- while (!minHeap.isEmpty()){
- arr[sortIndex++] = minHeap.poll();
- }
-
- }