Java源码-N个数字中第k个最大值的求解方法

翻开《数据结构》正文第一页,作者问了个问题:N个数字中的第k个最大值怎么计算?
作者认为,对于学编程两年的人而言,这个问题应该可以拿下。

事实上,这是我刚学习编程,考计算机等级考试3、4级时的基本问题,当时是在别人写好的C语言代码段里,加上一个嵌套的for循环,就轻松搞定。
然而,10多年后,我决定用已经学了这么久的Java来“徒手”写个小程序,解决这个问题。

经验:
1. 用户输入数字的个数不确定,不能用数组来存储用户输入的值,而采用ArrayList来存储。
2. 最好先用纸笔预演一下,获得一个大概的算法,然后再写代码、调试。算法没搞清,直接写代码,有点本末倒置之嫌。
3. 常用算法,最好熟记,如果自己从零开始去琢磨,呵呵,你得感谢你老板给你那么多空闲时间。


代码如下:
<pre class="java" name="code">import java.util.Scanner;
import java.util.ArrayList;

//n个数,求最大的数字中的第k个
public class HelloSort {

	
	public static void main(String[] args){
		Scanner input=new Scanner(System.in);
		int count=0;
		ArrayList<Double> numbers=new ArrayList<Double> ();
		double entry=0;

		
		do {
			System.out.print("请输入数字(输入-1结束输入):");
			entry=input.nextDouble();
			if(entry==-1)
				System.out.printf("已完成输入%n");
			else
			{
				numbers.add((Double)entry);
				count++;
			}
		}
		while(entry!=-1);
		
		double[] sortedNumbers=new double[count];
		for (int i=0;i<count;i++)
			sortedNumbers[i]=numbers.get(i);
		
		/*核心算法:用数组中未排序部分的第一个数和其后面所有数字比较,如果后面数字大,则互换位置
		这样可保证排在前面的数字是最大的,n个数需要循环n-1次*/
		double temp=0;
		for (int i=0;i<count-1;i++){
			for (int j=i+1;j<count;j++){
			if (sortedNumbers[j]>sortedNumbers[i]){
				temp=sortedNumbers[j];
				sortedNumbers[j]=sortedNumbers[i];
				sortedNumbers[i]=temp;
				}
			}
		}
		
		System.out.print("请输入k值:");
		int k=input.nextInt();
		System.out.printf("共输入了%d个数,分别为:",count);
		for (int i=0;i<count;i++){
			System.out.printf(numbers.get(i)+"\t");
		}
		System.out.printf("%n从大到小的排序为:");
		for (int i=0;i<count;i++){
			System.out.print(sortedNumbers[i]+"\t");
		}
		System.out.printf("%n最大的数字中的第"+k+"个为:"+sortedNumbers[k-1]+"%n%n");
	}

}

 
运行结果:

请输入数字(输入-1结束输入):1.11
请输入数字(输入-1结束输入):2.12
请输入数字(输入-1结束输入):3.14159
请输入数字(输入-1结束输入):1.414
请输入数字(输入-1结束输入):-0.707
请输入数字(输入-1结束输入):-2.235
请输入数字(输入-1结束输入):5.325
请输入数字(输入-1结束输入):6.876
请输入数字(输入-1结束输入):16.50
请输入数字(输入-1结束输入):205.0698
请输入数字(输入-1结束输入):-1
已完成输入
请输入k值:6
共输入了10个数,分别为:1.11 2.12 3.14159 1.414 -0.707 -2.235 5.325 6.876 16.5 205.0698 
从大到小的排序为:205.0698 16.5 6.876 5.325 3.14159 2.12 1.414 1.11 -0.707 -2.235 
最大的数字中的第6个为:2.12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值