n个数里最小的k个

本文介绍了一个Java程序,用于解决从n个整数中找出最小的k个整数的问题。通过读取一组由空格分隔的整数及k值作为输入,程序使用堆排序算法对这些整数进行排序,并最终输出最小的k个整数。文章包含了完整的代码实现及注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

找出n个数里最小的k个

输入描述

每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n
不超过100。

输出描述

输出n个整数里最小的k个数。升序输出

示例1

输入
3 9 6 8 -10 7 -11 19 30 12 23 5
输出
-11 -10 3 6 7


import java.util.Scanner;

public class Main{

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] s = str.split(" ");

        try {
            int[] arr = new int[s.length - 1];
            for(int i = 0; i < s.length-1; i++) {
                arr[i] = Integer.valueOf(s[i]);
            }
            int n = Integer.valueOf(s[s.length-1]);
            heapSort(arr,n);
            for(int i = arr.length-1; i > arr.length-n; i--) {
                System.out.print(arr[i] + " ");
            }
            System.out.println(arr[arr.length-n]);
        } catch (NumberFormatException e) {

            e.printStackTrace();
        }

    }

    public static void heapSort(int[] arr,int n) {
        //初始化调整堆
        for(int i = arr.length / 2; i >= 0; i--) {
            adjustHeap(arr,i,arr.length);
        }

        for(int i = arr.length-1; i > arr.length-1-n; i--) {
            swap(arr,0,i);
            adjustHeap(arr,0,i);
        }
    }

    /**
     * 调整堆
     * @param arr
     * @param parent
     * @param length 未排序的序列长度
     */
    private static void adjustHeap(int[] arr,int parent,int length) {
        int temp = arr[parent];         //保存当前父节点的值
        int child = parent * 2 + 1;     //获得该父节点的左孩子的索引

        while(child < length) {
            //如果存在右孩子 且 右孩子的值比左孩子小,取右孩子索引
            if(child + 1 < length && arr[child + 1] < arr[child]) {
                ++child;
            }

            //如果父节点的值小于孩子的值,直接结束
            if(temp < arr[child]) {
                break;
            }

            //否则把最小孩子的值赋给父节点
            arr[parent] = arr[child];

            //从该节点的左孩子开始继续向下调整堆
            parent = child;
            child = child * 2 + 1;
        }
        arr[parent] = temp;
    }

    /**
     * 交换数组元素
     * @param arr
     * @param a
     * @param b
     */
    private static void swap(int[] arr,int a,int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值