继上篇深入探究第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大数
相关推荐
动态数组是一种可以在运行时改变其大小的数组,它与静态数组不同,静态数组在声明时就需要指定固定的大小。动态数组通常通过指针和内存管理函数(如C++中的`new`和`delete`,Java中的`ArrayList`)来实现,允许我们...
两个大数相乘:利用数组实现,数组a存放大数1的每一位,数组b依次存放大数2的每一位。如:一大数1为3463546,则数组 a[]={3,4,6,3,5,4,6},大数2为:89019 则数组b[]={8,9,0,1,9},现在要大数1和大数2相乘,并按数位...
每个数组元素代表大数的一个位,从低位到高位排列。例如,如果一个大数是12345,数组可以是`{5, 4, 3, 2, 1}`。数组长度通常会比大数的实际位数多一位,用于存储进位或借位。 3. **加法运算**: 加法运算从数组的...
java用数组写的大数类,实现大数类的加法···
本项目通过链表和数组两种数据结构来实现大数的加减乘除操作,旨在深入理解数据结构与算法的运用。 ### 链表实现大数 1. **链表基础知识**:链表是一种线性数据结构,它的元素在内存中不是顺序存放的,而是通过...
本文将深入探讨如何使用C语言来解决这个问题,特别是在处理大数时如何避开计算机字长的限制,实现高精度的计算。 阶乘是一个数学概念,表示一个正整数N的所有小于等于N的正整数的乘积,表示为N!。例如,5的阶乘是5!...
首先,我们来理解问题的定义:给定一个大小为n的数组A,我们要找到数组中的第k大数,即数组中排名为k的元素,其中k <= n。当k等于1时,问题转化为寻找数组中的最大值,而k等于2时则要找第二大数,以此类推。 传统的...
1. **初始化**:创建两个字符数组,分别存储两个大数。由于大数是从右向左读取的,因此我们需要将它们反向存储,即从个位开始存储,最高位存储在数组的末尾。 2. **逐位相乘**:遍历两个大数的每一位,对于每个位置...
通过分析和学习这个代码,你可以深入了解如何在实际编程中处理大数,以及如何在有限的时间内编写出高效、可靠的算法。 总的来说,这个项目涵盖了数据结构、算法设计、大数表示和操作等多个关键的计算机科学概念,对...
每个数组元素代表一个位,比如数组的第0个元素可能是最高位(也就是个位),第1个元素是次高位(十位),以此类推。为了计算阶乘,我们可以采用以下步骤: 1. 初始化一个足够大的数组,用于存储结果的大数。 2. ...
### MATLAB算法查找数组中第二大数 #### 一、问题背景及需求分析 在计算机科学领域,查找数组中的第二大数值是一个常见的编程任务。本篇文章将详细探讨三种不同的算法方法:顺序比较算法、空间换时间的改进算法...
求数组中第K大的数可以基于快排序思想,步骤如下:1、随机选择一个支点2、将比支点大的数,放到数组左边;将比支点小的数放到数组右边;将支点放到中间(属于左部分)3、设左部分的长度为L,当K < L> L时,递归地在有...
典型的Top K算法 找出一个数组里面前K个最大数 Top K算法是解决一个经典的问题,即在一个大规模的数组中找到前K个最大数的问题。在这个问题中,我们需要在一个数组中找到前K个最大数,例如在搜索引擎中,需要找出最...
2. **遍历**:从后往前遍历数组,找到第一个不等于最大值的数即为第二大数。 **优点**: - 实现简单。 **缺点**: - 排序的时间复杂度较高(O(nlogn)),不适合大数据量。 ##### 方法二:一次遍历 1. **初始化**...
1. **使用数组存储大数**:由于标准整数类型(如`long`)无法存储非常大的数字,本例中采用了一个`long`类型的数组`a[]`来存储大数的每一位。数组中的每个元素代表大数的一位,通过这种方式可以有效地存储任意大的...
然后,假设我们要将这个大数组按照某个倍数(比如3)拆分成小数组,我们可以编写一个函数来实现这个功能。这个函数接受两个参数:原始数组和拆分倍数。以下是一个可能的实现: ```php function split_array_by_...
在编程领域,数组是基本的数据结构之一,常常用于存储一系列有序或无序的数值。在处理数组时,有时我们需要找出数组中的最大值或次大值。这篇文章主要探讨了两种不同的方法来寻找数组中的第二大数。 首先,我们来看...