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

在一列数中求第k大的数字

 
阅读更多

这个题目的一种思路是利用快排思想来解决,可以达到O(nlogn)的时间效率。

详细代码如下:

/*
 * 在一列数中寻找第k大的数,使用快排思想,一趟快排后会返回一个基准点的位置,如果该位置loc正好处于
 * 要求的第k个数的位置,则该位置的数即为所求;如果loc>k,说明要求的第k大的数,在左边子数组中,如果loc<k,
 * 则要求的数为右边子数组的第k-loc个位置的数
 */
public class Findnth {
	public static void main(String args[]){
		int array[] = {5, 6, 7, 9, 8, 4, 3, 2, 1, 10, 12, 11, 13, 14, 15, 16, 17, 19, 18, 20} ;
		int re=select(array,0,array.length-1,15);
		System.out.println("第---小的数是:"+re);
	}
	
	public static int select(int a[],int left,int right,int k){//求第k小的数
		if(left==right){
			return a[left];
		}
		int loc=partition(a,left,right);//返回一趟快排后某个基准点的位置
		int kth=loc-left+1;//该基准数在当前的子数组中是第几小的数
		if(k==kth){//如果该趟排序后返回的基准位置所处的位置正好是这个子数组的第k小的数
			return a[loc];//返回处于该位置的值就是要求的第k小的数
		}else if(k<kth){
			return select(a,left,loc-1,k);//求左边子数组中的第k小的数
		}else{
			return select(a,loc+1,right,k-kth);//求右边子数组中的第k-kth小的数
		}
	}
	public static int partition(int a[],int left,int right){
		//一趟快排,返回以a[left]为基准点的位置
		int temp=a[left];
		while(left<right){
			while(left<right&&a[right]>=temp){
				right--;
			}
			a[left]=a[right];
			while(left<right && a[left]<=temp){
				left++;
			}
			a[right]=a[left];
		}
		a[left]=temp;
		return left;
	}
}
 
分享到:
评论
4 楼 502220545 2012-04-07  
albrich 写道
你可以看看我写的方法:http://hi.baidu.com/albrich/blog/item/012483da9518c22a33fa1c12.html

面试官的意图 根本不是让你用Array。sort()啊
3 楼 albrich 2012-02-29  
你可以看看我写的方法:http://hi.baidu.com/albrich/blog/item/012483da9518c22a33fa1c12.html
2 楼 albrich 2012-02-29  
我又仔细看了一下这个方法不太对,int [] n={1,23,12,12,12,58,24,44,32,56,56,56,67,23,44};
类似这样的数组:这是好多重复的数放在一起,你这个方法就不太好使了,你可以int re=select(array,0,array.length-1,4);
System.out.println("第4小的数是:"+re);
int re=select(array,0,array.length-1,3);
System.out.println("第3小的数是:"+re);
正确的答案应该是第3小的数是23,第4小的数是24,按你这方法都是12.



望改进!!!
1 楼 albrich 2012-02-29  
你是怎么想出来的,太厉害了,我有点看不懂

相关推荐

    pascal 从X个数字中选出N个数字的排法

    本篇文章将详细解析一个具体的排列问题:“从1到X这X个数字中选出N个,排成一列,相邻两数不能相同,求所有可能的排法”。我们通过Pascal语言来实现这一功能,并深入探讨其背后的逻辑和技术要点。 #### 问题描述 ...

    C语言程序设计-求一个四位数的各位数字的立方和.c

    C语言程序设计-求一个四位数的各位数字的立方和.c

    输出n个数字的全排列(可重复)

    2、输入n和k(n》=k)求n个数字的(n,k)排列 如n=3,k=2 输入的三个数位1 2 3 则输出 12 13 21 23 31 32 3、输入n个数(有重复),求n个数字的全排列 如:n=3 全排列的数字为1 1 2 则输出 112 121 211 4、输入...

    K210版本数字识别-kmodel模板.zip

    描述中同样提到“K210版本数字识别-kmodel模板.zip”,这可能是一个包含预训练模型和相关代码的资源包,旨在帮助用户在K210平台上实现数字的识别功能。kmodel是 Kendryte SDK 的一部分,它用于存储经过训练的神经...

    人工智能及大数据技术在数字营销中的应用.pdf

    例如,卡方自动交互列检测(CHAID)决策树就是一种常用的数据分割式决策树模型,它可以在数字营销中用于市场细分,帮助营销人员确定哪些因素对于目标客户的响应有最大的影响。 此外,帕累托定律(80/20法则)也常被...

    java有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    根据题目中的描述与提供的代码内容,本篇文章将详细介绍如何利用Java编程解决一个具体的组合问题:即使用数字1、2、3、4可以组成多少个不同的、无重复数字的三位数,并列出所有可能的组合。 ### 一、问题背景 题目...

    数字识别的数据

    在这种情况下,每个CSV文件可能包含多列,其中一列代表图像的像素值,另一列可能是对应的标签,即每个手写数字的正确识别结果。 对于数字识别,常用的方法包括支持向量机(SVM)、神经网络,尤其是卷积神经网络...

    数字逻辑与数字系习题答案(第三版)电子工业出版社

    根据提供的信息,我们可以推断出这是一本名为《数字逻辑与数字系统习题答案(第三版)》的书籍,由电子工业出版社出版。该书主要针对计算机专业学生提供数字逻辑课程相关的习题解答,帮助他们更好地理解和掌握数字...

    大学《数字电子技术》试题含答案.docx

    7. J-K触发器:J-K触发器是另一种常见的时序逻辑器件,其在不同输入条件下有不同的工作状态,如J=K=0时为保持状态,J=0、K=1时置“0”,K=0、J=1时置“1”,J=K=1时触发器翻转。 8. 扭环型计数器:用3个触发器可以...

    一种新颖的数字识别算法

    - **数字识别的意义**:数字识别作为光学字符识别(OCR)的一个重要分支,在多种应用场景中具有重要价值,比如脱机自动记录、车牌号码识别、身份证号码识别、支票号码识别以及邮政编码识别等。 - **传统OCR的局限性**...

    c语言 数字 拼图游戏 显示成功的步数

    它遍历整个数组,检查每个位置上的数字是否与其应有的位置相匹配(例如,1应该在第一个位置,2在第二个位置,以此类推),并且空位(0)是否位于数组的右下角。如果所有条件都满足,则返回1表示拼图完成;否则,返回...

    数字设计原理与实践第7章作业答案.doc

    "数字设计原理与实践第7章作业答案" 本资源为数字设计原理与实践第7章作业答案,包含了数字设计原理与实践的重要知识点,涵盖了数字电路的基本概念、数字逻辑电路的设计方法、触发器的原理与应用、状态机的设计与...

    数字电子技术基础(第四版)课后习题答案_第四章.docx

    《数字电子技术基础》第四版课后习题答案主要涵盖了数字电路中的触发器相关知识,特别是RS、D、JK和T触发器的工作原理及其应用。本章内容涉及到以下几个关键知识点: 1. **触发器的基本概念**:触发器是数字电路中...

    求数组的逆序数

    在计算机科学和编程领域,"数组的逆序数"是一个重要的概念,特别是在算法分析和排序算法中。逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序...

    excel表格中按字母中间的数字大小排序PPT学习教案.pptx

    2. **插入辅助列**:在需要排序的列(例如J列)旁边插入一列。在新的列(J列)中,从第四行开始,输入公式`=H4&I4`,其中H4和I4是原始数据所在的单元格。这个公式用于合并H列和I列的内容,以便后续处理。 3. **复制...

    数字逻辑电路书后习题答案.pdf

    本部分将详细解读数字逻辑电路相关的知识点,涵盖二进制数的表示、真值表的构建、逻辑函数的化简以及Karnaugh图(K图)化简法的应用。 首先,二进制数包括原码、反码和补码,用于表示正数和负数。原码是最直观的...

    数字签名算法DSS

    在实验中,我们使用 C 语言实现了 DSS 数字签名算法,并使用 SHA-1 生成散列的程序对信息进行签名和验证。实验结果表明,DSS 数字签名算法可以确保信息的完整性和身份验证。 实验环境: * 运行 Windows 或 Linux ...

    编程,求解和为15的棋盘游戏问题。要求将从1到9的九个数填入3×3的棋盘中,使得各行、各列以及两个对角线上的三个数之和均为15,并打印出结果。

    3. 每一列的三个数字之和为15。 4. 主对角线(左上到右下)的三个数字之和为15。 5. 副对角线(右上到左下)的三个数字之和为15。 ### 二、解决方案分析 #### 1. 数据结构选择 为了表示3×3的棋盘,我们可以使用一...

    MNIST手写数字识别的数字集MNIST_data.zip

    每个图像都附带一个标签,表示图像中的数字是0到9中的哪一个。MNIST数据集的组织结构使得它成为新手学习深度学习的绝佳选择,因为它相对较小,处理起来比较快速,但又足够复杂,可以展示出深度学习模型的强大能力。 ...

Global site tag (gtag.js) - Google Analytics