题目描述
输入n个整数,输出其中最小的k个。
详细描述:
接口说明
原型:
bool GetMinK(unsignedint uiInputNum, int * pInputArray, unsignedint uiK, int * pOutputArray);
输入参数:
unsignedint uiInputNum //输入整数个数
int * pInputArray //输入整数数组
unsignedint uiK //需输出uiK个整数
输出参数(指针指向的内存区域保证有效):
int * pOutputArray //最小的uiK个整数
返回值:
false 异常失败
true 输出成功
输入描述:
输入说明
1 输入两个整数
2 输入一个整数数组
输出描述:
输出一个整数数组
示例1
输入
5 2 1 3 5 7 2
输出
1 2
代码如下:
1 package com.yzh.hehe; 2 3 import java.util.Scanner; 4 5 public class OutputNMin { 6 /* 7 * 先以o(n)时间建一个堆,再依次删除k个堆顶值 8 * 9 * */ 10 public static void main(String[] args) { 11 Scanner scanner=new Scanner(System.in); 12 while ( scanner.hasNext()) { 13 int size=scanner.nextInt(); 14 int k=scanner.nextInt(); 15 int[]arr=new int[size+1]; 16 int temp; 17 for (int i = 1; i <= size; i++) { 18 temp=scanner.nextInt(); 19 insertHeap(arr, temp,i); 20 } 21 for (int i = 0; i < k; i++) { 22 deleteHeapMain(arr, size-i); 23 } 24 int p=size-k+1; 25 for (int i =size ; i >p; i--) { 26 System.out.print(arr[i]); 27 System.out.println(" "); 28 } 29 System.out.print(arr[p]); 30 } 31 scanner.close(); 32 33 34 35 36 } 37 //建堆 执行n次建堆操作O(n) 38 private static void insertHeap(int[] arr,int value,int p) { 39 int i; 40 for ( i = p; i>1&&arr[i/2]>value; i=i/2) { 41 arr[i]=arr[i/2]; 42 } 43 arr[i]=value; 44 } 45 //删除堆顶值(最小值) 46 private static void deleteHeapMain(int[]arr,int length) { 47 int reV=arr[1];//删除第一个值 48 int lastV=arr[length]; 49 int i,child; 50 //2*i <=length保证空格还没下沉到最底层 51 for (i = 1; 2*i <=length ;i=child ) { 52 child=2*i; 53 if(child!=length&&(arr[2*i]>arr[2*i+1])){ 54 child++; //判断走左还是走右 55 } 56 //判断是否能将最后一个值插入到目前的空格 57 if(lastV>arr[child]){ 58 arr[i]=arr[child]; 59 }else{ 60 break; 61 } 62 } 63 arr[i]=lastV; //插入最后一个值 64 arr[length]= reV;//用来存储删除的第一个值 65 } 66 }
浙公网安备 33010602011771号