剑指offer -- 最小的K个数

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

思路,首先构造最大堆,利用最大堆进行升序排序,取出前k个

	public ArrayList<Integer> GetLeastNumbers_Solution(int [] arr, int k) {
        ArrayList<Integer> list = new ArrayList<Integer>();

        if(k < 1 ||k > arr.length) return list;
        //从最后一个非叶子结点开始,对整棵树进行最大堆调整,建成最大堆
		for(int i = (arr.length - 1) / 2 ; i >= 0; i--)
			adjustHeap(arr,i,arr.length);
		
		//开始排序
		for(int i = arr.length-1; i >= 0; i--){
			swap(arr,0,i);
			adjustHeap(arr,0,i);
		}
        
		for(int i = 0; i < k; i++)
            list.add(arr[i]);
       
        return list;
	}

	private void adjustHeap(int[] arr, int i, int length) {
		int temp = arr[i];
		
		for(int k = 2 * i + 1; k < length; k = 2 * k + 1){
			//找出左右子节点中较大的节点
			if(k + 1 < length && arr[k] < arr[k + 1])
				k = k + 1;
			
			//如果子节点〉根节点进行交换
			if(arr[k] > temp){
				swap(arr, i ,k);
				i = k;
			}else
				break;
		}
		
	}

	private void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

你可能感兴趣的:(剑指offer -- 最小的K个数)