import java.util.ArrayList;
public class Solution {
/**
堆排序
*/
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> ret = new ArrayList<>() ;
if(input == null || input.length == 0 || k == 0 || k > input.length) {
return ret ;
}
//创建小顶堆
for(int i = (input.length-2)/2 ; i >= 0 ; i --) {
heapify(input,input.length,i) ;
}
//开始交换
for(int j = input.length-1,q = 1 ; j >= 0 && q <= k ;q++, j --) {
swap(input , 0 , j) ;
ret.add(input[j]) ;
heapify(input , j , 0) ;
}
return ret ;
}
/**
调整堆:len表示调整的堆对应的数组的长度 , i表示调整哪一个结点(默认该节点的子节点们已经是堆了)
*/
public void heapify(int[] arr , int len ,int i) {
if(i >= len) {
return ;
}
int l = i * 2 + 1 ;
int r = i * 2 + 2 ;
int minIndex = i ;
if(l < len && arr[minIndex] > arr[l]) {
minIndex = l ;
}
if(r < len && arr[minIndex] > arr[r]) {
minIndex = r ;
}
if(minIndex != i) {
swap(arr , i , minIndex) ;
heapify(arr,len , minIndex) ;
}
}
public void swap(int []arr , int i , int j) {
int temp = arr[i] ;
arr[i] = arr[j] ;
arr[j] = temp ;
}
}