天地无极,乾坤剑法

导航

 

题目描述

输入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 }

 

posted on 2018-01-15 23:10  天地无极,乾坤剑法  阅读(115)  评论(0)    收藏  举报