`
郑云飞
  • 浏览: 793805 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入探究N个数组的第K大数是多少

 
阅读更多

继上篇深入探究第k大数之后,此篇博客继续对上一篇进行深入探究,深入探究N个数组的第K大数是多少?

修改后的程序代码如下

package com.yting.hadoop.rpc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 第三大数优化
 * @author zhengyunfei
 * @date 2014-04-18
 *
 */
public class GetThirdData {
	public static void main(String[] args) throws IOException {
		int N = 0;
		int k=0;
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输入一位数组的个数:");
		N=Integer.parseInt(br.readLine());
		System.out.println("请输入要求第几大数:");
		k=Integer.parseInt(br.readLine());

		int a[] = new int[N];
		//自定义10万个数,赋予一位数组a
		for(int i=0;i<N;i++){
			System.out.println("请输入第"+(i+1)+"个数:");
			int num=Integer.parseInt(br.readLine());
			a[i]=num;
		}
		//程序执行开始时间
		long pre=System.currentTimeMillis();
		//求第k大数,与第三大数为例
		int result=getSortKnum(a,k);
		//程序执行结束时间
		long last=System.currentTimeMillis();
		long time=last-pre;//运行时间
		System.out.println("运行结果为:");
		System.out.print("第三大数:"+result+"  耗时:"+time+"毫秒");
	}
	/**
	 * 求第k大数
	 * @param a 数组名
	 * @param k 第几大数
	 * @return 第k大数
	 */
	private static int getSortKnum(int [] a,int k){
		int array[]=new int [k];//首先定义一个k个数的一位数组
		//将数组前k个数存放到数组array当中
		for(int i=0;i<k;i++){
			array[i]=a[i];
		}
		array=getSortArray(array);//对这k个数的数组进行冒泡排序
		for(int i=k;i<a.length;i++){//将余下的数与第k大数进行比较
			if(a[i]>array[k-1]){//如果余下数比第k大数大的话,将第k大数替换掉
				array[k-1]=a[i];
				array=getSortArray(array);//重新对数组进行排序
			}
		}
		return array[k-1];
	}
	/**
	 * 对数组进行冒泡排序
	 * @author zhengyunfei
	 * @date 2014-04-18
	 * @param a 数组名
	 * @return a 排序后的数组
	 */
	private static int [] getSortArray(int a[]){
		for(int i=0;i<a.length-1;i++){
			for(int j=0;j<a.length-i-1;j++){
				if(a[j]<a[j+1]){
					swap(a, j);
				}
			}
		}
		return a;
	}
	/**
	 * 交换位置
	 * @author zhengyunfei
	 * @date 2014-04-18
	 * @param a 数组名
	 * @param j  下标
	 */
	private static void swap(int[] a, int j) {
		int temp=a[j];
		a[j]=a[j+1];
		a[j+1]=temp;
	}

	
	
}

 运行结果如下:

请输入一位数组的个数:
10
请输入要求第几大数:
3
请输入第1个数:
1
请输入第2个数:
2
请输入第3个数:
3
请输入第4个数:
4
请输入第5个数:
9
请输入第6个数:
8
请输入第7个数:
7
请输入第8个数:
6
请输入第9个数:
5
请输入第10个数:
4
运行结果为:
第三大数:7  耗时:0毫秒

 经过测试,程序是正确的,但是细心的朋友会发现,在控制台输入N和K的时候,我没有做限制,比如N和K必须是数字,并且N必须大于等于K,在此本人就不做限制了,感兴趣的朋友可以补充上。

至此,针对求第三大数的算法,我已经写了5篇博客,从前之后以此为:

第一篇:初写求第三大数算法

第二篇:优化求第三大数算法

第三篇:深入探究第三大数

第四篇:深入探究第K大数

第五篇:深入探究N个数组的第K大数

分享到:
评论

相关推荐

    动态数组实现大数乘法

    两个大数相乘:利用数组实现,数组a存放大数1的每一位,数组b依次存放大数2的每一位。如:一大数1为3463546,则数组 a[]={3,4,6,3,5,4,6},大数2为:89019 则数组b[]={8,9,0,1,9},现在要大数1和大数2相乘,并按数位...

    用动态数组实现的大数阶乘

    用数组来实现大数的阶乘运算,运算结果保存在一个数组中,每个数组元素村3为数字。

    java大数类用数组实现大数的加法···

    java用数组写的大数类,实现大数类的加法···

    大数加减(字符数组保存)

    数据结构课设时,老师让选作的ACM的题,用的是字符数组保存的大数,没用栈和队列!编译过的C++文件!

    数组中求第K大数的实现方法

    问题:有一个大小为n的数组A[0,1,2,…,n-1],求其中第k大的数。该问题是一个经典的问题,在《算法导论》中被作为单独的一节提出,而且其解决方法很好的利用了分治的思想,将时间复杂度控制在了O(n),这多少出乎我们...

    深入线性时间复杂度求数组中第K大数的方法详解

    求数组中第K大的数可以基于快排序思想,步骤如下:1、随机选择一个支点2、将比支点大的数,放到数组左边;将比支点小的数放到数组右边;将支点放到中间(属于左部分)3、设左部分的长度为L,当K &lt; L&gt; L时,递归地在有...

    第二大数查找

    一个数组中第二大数的查找,很方便用户进行数据的查找,代码简单,安全移动

    java 数组实现大数加减乘除运算

    java 数组实现大数加减乘除运算 下载 算法思想很简单,都是我自己做的,相信肯花时间每个人都可以写出来更好的。

    典型的Top K算法 找出一个数组里面前K个最大数.doc

    典型的Top K算法 找出一个数组里面前K个最大数.doc

    vc++数组实现大数阶乘

    vs2010可以直接打开实现大数阶乘功能,利用数组实现大数阶乘功能。

    快速排序找数组中的第N大数

    若是要找数组中第N大元素 使用快排每完成一轮排序,判断基准数的索引 和 数组长度-N 的关系 索引 = 数组长度-N : 此基准数就是要找的第N大元素 索引 &gt; 数组长度-N : 要找的元素在左边 索引 &lt; 数组长度-N : 要...

    大数数组阶乘

    c++语言下的大数阶乘数组形式,适合学习c++的初学者模仿学习

    大数存储以及计算的算法

    本文主要论述三方面的内容:一是浅谈大数计算的计算类型,思考大数简单计算的算法,并且做出可行的程序设计;二是将前面生成的算法应用到椭圆曲线密码体制中;三是展望大数计算的发展前景。

    大数(链表、数组)实现

    这是数据结构的课程设计,分别用链表和数组实现大数的加减乘除。

    简单大数相乘,用数组存数

    实现简单的正数相乘,代码简单,大数只能用字符型来存储,因为int最大也就几万,所以要实现字符到整数之间的转换的。还有要进行反向存储数字,反向输出。具体问题在代码中有实现与说明

    C++实现的O(n)复杂度内查找第K大数算法示例

    本文实例讲述了C++实现的O(n)复杂度内查找第K大数算法。分享给大家供大家参考,具体如下: 题目:是在一组数组(数组元素为整数,可正可负可为0)中查找乘积最大的三个数,最后输出最大乘积。 从题目我们知道只有两...

    如何寻找数组中的第二大数

    本篇文章是对如何寻找数组中的第二大数进行了详细的分析介绍,需要的朋友参考下

    计算大数N的阶乘,N可以任意大,只需修改数组的大小即可。

    该程序小巧精辟,注释详细,很适合初学者上手,本程序克服了计算机字长对计算精度的限制,采用char数组保存计算结果和中间值,从而避开了计算机数值表示范围的限制,实践了大数化小,分而治之的算法精髓。

Global site tag (gtag.js) - Google Analytics