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 ; } }