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

来源:互联网 发布:https默认端口是多少 编辑:程序博客网 时间:2024/06/06 23:57
翻开《数据结构》正文第一页,作者问了个问题: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

0 0
原创粉丝点击