`
暗蓝幽谷
  • 浏览: 11806 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一组N个数,确定其中抵第k个最大值

阅读更多

首先,这个问题的最容易想到的就是冒泡排序。先把N个数存入数组中,之后 用冒泡算法从大到小排序,在取k位置的值。

具体求解过程如下:

import java.util.Random;

public class MaxK{

	static int[] nums = new int[20];
	
	static Random rand = new Random(4);

	public static void main(String[] args){
		int k = Integer.parseInt(args[0]);
		init();
		printNums(nums);
		int[] sortBubble = bubbleSort(nums);
		printNums(sortBubble);
		
		System.out.println(sortBubble[k - 1]);
	}


	static void printNums(int[] nums){
		for(int i = 0, len = nums.length; i < len; i++)
			System.out.print(nums[i] + " ");
		System.out.println();
	}
	
	static void init(){
		for(int i = 0; i < 20; i++)
			nums[i] = rand.nextInt(100);
	}
	
	static int[] bubbleSort(int[] nums){
		int arrLen = nums.length;
		int[] bubble = new int[arrLen];	
		System.arraycopy(nums, 0, bubble, 0, arrLen);
		
		for(int i = 0; i < arrLen; i++){
			int tk = bubble[i];
			int tkj = i + 1;
			for(int j = i + 1; j < arrLen; j++){
				if(bubble[j] > tk){	
					tk = bubble[j];
					tkj = j;
				}
			}
			if(tk > bubble[i]){
				int temp = bubble[i];
				bubble[i] = bubble[tkj];
				bubble[tkj] = temp;
			}
		}
		
		return bubble;
	}
}

 还有稍微好一些的算法,就是先把前k个元素读入数组,再对其排序(递减)。接着逐个对比剩下的元素,将符合的元素插入k数组,调整k数组。

	static int maxK(int lk){// 求第lk大的数值
		int[] karr = new int[lk];
		System.arraycopy(nums, 0, karr, 0, lk);
		
		int[] bubbledKarr = bubbleSort(karr);
		int rek = bubbledKarr[lk - 1];
		
		for(int i = lk; i < 20; i++){ //20是nums长度,判断剩下的元素
			if(nums[i] > bubbledKarr[lk -1]){
				int loc = lk -2;
				for(; loc >=0 ; loc--)
					if(nums[i] < bubbledKarr[loc])
						break;
				loc++; //定位插入元素位置
				int[] temp = new int[lk - loc];//需要调整的k数组的值
				System.arraycopy(bubbledKarr, loc, temp, 0, lk - loc);
				bubbledKarr[loc] = nums[i];
				System.arraycopy(temp, 0, bubbledKarr, loc + 1, lk - loc -1);//调整替换元素之后的k数组
				
			}
		}

		return bubbledKarr[lk - 1];
	}

 

 

0
0
分享到:
评论

相关推荐

    删数问题算法程序(排列成一个新的正整数)

    - 给定一个长度为 \( n \)(\( 1 \leq n \leq 200 \))的正整数 \( a \) 和一个正整数 \( k \)(\( k &lt; n \)),其中 \( k \) 表示需要删除的数字的数量。 - 目标是设计一个算法来找到一种方式,使得删除 \( k \) 个...

    在一堆数中取得前K个最大最小的数的方法

    在计算机科学领域,特别是数据处理和分析方面,“找到一组数中的前K个最大或最小的数”是一个常见而又重要的问题。这类问题不仅在日常开发工作中频繁出现,也是IT类考试的重点考察内容之一。本文旨在介绍几种解决这...

    分治法求最大值的C++实现

    - 如果`low`与`high`相邻,即数组有且仅有两个元素,通过比较这两个元素的值来确定并返回最大值。 - 对于包含多个元素的数组,函数计算中间索引`mid`,将数组分成两半,并递归地调用自身来找出两半的最大值,最后...

    给定一个精确整数,用分治法删除两个最大数两个最小数。

    假设我们有一个整数数组`arr`,我们需要找到其中的两个最大值`max1`和`max2`以及两个最小值`min1`和`min2`,并将它们从数组中移除。注意,这里我们假设数组长度至少为4,以确保有四个元素可供删除。 分治法的基本...

    分治算法找最大最小值和k值[参照].pdf

    在本实验中,我们将使用分治算法来解决两个问题:一是查找n个数的最大值和最小值,二是找到第k个最小元素。 查找最大最小值 在这个问题中,我们将使用分治策略来解决问题。首先,我们将n个元素分成两组:A1={A[1],...

    微软技术面试-寻找最大的K个数

    - **时间复杂度**:每次分割将搜索范围减半,因此平均时间复杂度为O(N*log(Vmax-Vmin)),其中Vmax和Vmin分别为数组的最大值和最小值。 - **核心算法**: - 定义一个初始范围[Vmin, Vmax]。 - 在范围内进行二分查找...

    求最大数

    有时会增加限制条件,如找出第k大的数,或者在常数时间内求解最大值。 综上所述,"求最大数"是一个简单但实用的编程任务,其解决方案涵盖了多种编程语言、数据结构和算法,以及在实际应用中的各种场景。理解和掌握...

    数据挖掘-K-Means算法

    - **第一步**:从数据集中随机选择一个样本点作为第一个聚类中心。 - **第二步**:对于数据集中每个样本点\(x\),计算其与已选择的聚类中心之间的距离\(D(x)\)。 - **第三步**:选择下一个聚类中心的概率与\(D(x)...

    C++回溯算法实验报告

    首先,实验的第一个问题是删数问题。这个问题要求在给定的n位正整数a中去掉k个数字,使得剩下的数字排列成的新正整数尽可能大。为了解决这个问题,我们并不需要一次性找出所有可能的组合,而是采取贪心策略,依次...

    算法分析与设计习题集答案

    35、 编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。 回溯法 36、 (组合问题)求出从自然数1,2,…,n中任取r个数的所有组合。 37、 传教士与野人渡河问题。有M个传教士...

    2019_2020学年高中数学第2章数列2.3等差数列的前n项和第2课时等差数列前n项和的应用课件新人教A版必修52020042

    - 当首项`a1`大于零,公差`d`小于零时,`Sn`有**最大**值,这个最大值发生在`an`等于0的项数`n`上,可以通过不等式组`an &gt;= 0`和`an+1 来确定。 - 当首项`a1`小于零,公差`d`大于零时,`Sn`有**最小**值,这个...

    C/C++数据结构_随机10000个数:排序~8大排序代码集.rar

    时间复杂度为O(n+k),其中k是元素的范围。 这些排序算法各有优缺点,适用场景不同。例如,快速排序通常在实际应用中表现优秀,而归并排序则在稳定性上有优势。通过这个压缩包中的源代码,学习者可以对比不同算法的...

    组合数学习题解答

    例如,从n个不同元素中选择k个元素的组合数记为C(n,k),排列数记为P(n,k)。组合数的计算公式为C(n,k) = n! / [k!(n-k)!],其中!表示阶乘。 2. **二项式定理**:这是组合数学中的一个重要定理,表示(a + b)^n可以...

    java编程练习题

    - 如果k能够整除n,则k是n的一个质因数。 - 更新n为n/k,继续分解。 - 重复以上步骤直到n等于1。 #### 知识点6:成绩等级划分 - **定义**:根据分数划分等级。 - **实现思路**: - 使用条件运算符判断学生成绩...

    北京市各地2015届高三数学上学期考试试题分类汇编 排列组合二项式定理 理

    公式为(α+β)^n=∑_{k=0}^{n}C(n,k)α^(n-k)β^k,其中C(n,k)是组合数,表示从n个不同元素中取k个元素的组合数。第三题和第四题考察的就是二项式定理中特定项的系数,这通常涉及到组合数的计算。 对于二项式定理中...

    华为OD机试C卷- 矩阵匹配(Java & JS & Python & C).md-私信看全套OD代码及解析

    题目要求从一个N*M(N≤M)的矩阵中选出N个数,其中任意两个数字不能在同一行或同一列,并要求求出这N个数中第K大的数字的最小值。 #### 输入输出描述 - **输入描述**: 给定三个整数N, M, K (1≤K≤N≤M≤150),...

    NOIP2010普及组初赛试题

    - **解析**:对于一个完全二叉树,第 n 层最多有 \(2^{n-1}\) 个结点,从第 1 层到第 n 层总共最多有 \(\sum_{i=0}^{n-1}2^i = 2^n - 1\) 个结点。正确答案是 A.2^n-1。 **6. 存储程序原理** - **题目内容**:提出...

    从键盘任意输入N个整数 排序后 二叉搜索查询 从键盘输入的某个任意整数的序号

    该程序结合了两种基本的算法——冒泡排序和二分查找,实现了从键盘输入一组整数,排序后查找特定整数的功能。通过这种方式,不仅展示了这两种算法的基本实现方式,还演示了如何将它们结合起来解决实际问题。这对于...

    K均值聚类(K-MEAN).rar

    - **计算复杂度**:K均值的时间复杂度为O(n * k * i),其中n是数据点数量,k是类别数,i是迭代次数,对于大数据集可能会较慢。 5. **改进与变种**: - **DBSCAN**:基于密度的聚类算法,能处理不规则形状的簇和...

Global site tag (gtag.js) - Google Analytics