IBM面试题:n个无序整数,求第K大或者前K大的数(不要求排序输出,找到就行) [问题点数:20分,结帖人lxzcyh]

一键查看最优答案

确认一键查看最优答案?
本功能为VIP专享,开通VIP获取答案速率将提升10倍哦!
Bbs1
本版专家分:0
结帖率 85.71%
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
版主
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
版主
Blank
微软MVP 2005年7月 荣获微软MVP称号
2007年7月 荣获微软MVP称号
2006年7月 荣获微软MVP称号
Blank
黄花 2010年6月 专题开发/技术/项目大版内专家分月排行榜第二
Blank
蓝花 2010年4月 专题开发/技术/项目大版内专家分月排行榜第三
Bbs1
本版专家分:0
Bbs1
本版专家分:0
版主
Blank
微软MVP 2005年7月 荣获微软MVP称号
2007年7月 荣获微软MVP称号
2006年7月 荣获微软MVP称号
Blank
黄花 2010年6月 专题开发/技术/项目大版内专家分月排行榜第二
Blank
蓝花 2010年4月 专题开发/技术/项目大版内专家分月排行榜第三
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
Bbs1
本版专家分:0
C语言 输入n这个n中的最大,最小
C语言
面试题—— 找出一个无序整型组中第k大的
<em>面试题</em>—— 找出一个无序整型<em>数</em>组中第k大的<em>数</em>。
从一组无序的中找出N大的
经常会遇见这样的问题,如何从一组序列中找出最大的N个<em>数</em>,比如从一个班级的成绩中找出总成绩的<em>前</em>三名。可能会有一个比较简单的做法就是先将这组序列<em>排序</em>,然后<em>前</em>N个值自然而然就得到了。这对于比较少的序列,是可行的,比如<em>前</em>面说的一个班的<em>前</em>三名,但是对于<em>数</em>据量特别庞大的现实应用中,就不太现实了,例如我们经常用到的搜索引擎,它应该不会对她搜到的所有的页面先进行<em>排序</em>然后再返回<em>前</em>N个搜索结果吧,这样的话花费在<em>排序</em>上
无序K大/第K小的
方法一:quicksort 根据快排思想,从后往<em>前</em>找比基准<em>数</em>小的,交换位置。 从<em>前</em>往后找比基准<em>数</em>大的,交换位置。 最后安放基准<em>数</em>。 保证 l到p 是大<em>数</em>,若 p-l+1==k 那么p就是第<em>K</em>大 若 p-l+1&lt;k 那么从 p+1 到 r 中 找 k-(p-l+1)大的<em>数</em> 若 p-l+1&gt;k 那么从 l 到 p-1中 找第k大的<em>数</em>。 1 #i<em>n</em>clude&lt;i...
在N个元素中查找第k大的元素,有什么方法最快?
re
寻找无序组中第k大的
对于一个无序的<em>数</em>组,怎样<em>找到</em>其中第k大的<em>数</em>呢?下面总结几种方法。1.直接<em>排序</em>法使用常见的归并<em>排序</em>、堆<em>排序</em>等算法对<em>数</em>组进行<em>排序</em>,然后<em>找到</em>第k大的<em>数</em>。<em>排序</em>算法的时间复杂度为O(<em>n</em>log<em>n</em>),所以算法总的时间复杂度为O(<em>n</em>log<em>n</em>)。// Simple C++ program to fi<em>n</em>d k'th biggest eleme<em>n</em>t #i<em>n</em>clude #i<em>n</em>clude<algorith
找出N个无序中第K大的
使用类似快速<em>排序</em>,执行一次快速<em>排序</em>后,每次只选择一部分继续执行快速<em>排序</em>,直到<em>找到</em>第<em>K</em>个大元素为止,此时这个元素在<em>数</em>组位置后面的元素即所<em>求</em> 时间复杂度: 1、若随机选取枢纽,线性期望时间O(N) 2、若选取<em>数</em>组的“中位<em>数</em>的中位<em>数</em>”作为枢纽,最坏情况下的时间复杂度O(N) 利用快速<em>排序</em>的思想,从<em>数</em>组S中随机找出一个元素X,把<em>数</em>组分为两部分Sa和Sb。...
问题 A: 第k大
问题 A: <em>求</em>第k大<em>数</em> 时间限制: 1 Sec 内存限制: 128 MB 献花: 109 解决: 42 [献花][花圈][T<em>K</em>题库] 题目描述 <em>求</em>第k大的<em>数</em> (<em>K</em>th.pas/c/cpp) 给定一个长度为<em>n</em>(1≤<em>n</em>≤1,000,000)的无序正<em>整<em>数</em></em>序列,以及另一个<em>数</em>k(1≤k≤1,000,000)(关于第k大的<em>数</em>:例如序列{1,2,3,4,5,6}中第3大的<em>数</em>是4。) 输
在无序组中找到第k大的
在N个元素中查找第<em>K</em>大元素,一般比较简单的方法就是先快速<em>排序</em>,然后直接返回array[N - <em>K</em>]或者利用扫描法,每一次扫描都<em>找到</em>当<em>前</em><em>数</em>组中最大的元素,这个其实就是部分冒泡<em>排序</em>。<em>前</em>一种算法的时间复杂度是O(NlogN),后一种算法的时间复杂度是<em>K</em>*N。当然,这里我们不打算具体讨论以上两种方案,接下来看看其他方法。        第一种方法:利用堆<em>排序</em>的思想来查询<em>数</em>组中第<em>K</em>大元素。首先提取子<em>数</em>
无序序列中O(n)时间复杂度寻找最小(最大)的K
一、快速<em>排序</em>,平均复杂度为<em>n</em>*log<em>n</em> 二、维护<em>K</em>个最小(最大)堆,平均复杂度为<em>n</em>*log<em>K</em> 三、类似快排的划分方法
查找N个中第K大的
方法一:将一组<em>数</em>放入<em>数</em>组中,升<em>排序</em>。并返回第 ( le<em>n</em>gth - k )个元素 这里消耗的时间就是<em>排序</em>用的时间,用快速<em>排序</em>则为:O( N log N ) 代码: /** * 先<em>排序</em>后获取 * @retur<em>n</em> * * Date :2012-7-4 * Author :Go<em>n</em>gQia<em>n</em>g */ public i<em>n</em>t sortThe<em>n</em>Get(
输出K大的
关于问题描述给定一个<em>数</em>组,统计<em>前</em>k大的<em>数</em>并且把这k个<em>数</em>从大到小<em>输出</em>。输入第一行包含一个<em>整<em>数</em></em><em>n</em>,表示<em>数</em>组的大小。<em>n</em> < 100000。 第二行包含<em>n</em>个<em>整<em>数</em></em>,表示<em>数</em>组的元素,<em>整<em>数</em></em>之间以一个空格分开。每个<em>整<em>数</em></em>的绝对值不超过100000000。 第三行包含一个<em>整<em>数</em></em>k。k < <em>n</em>。<em>输出</em>从大到小<em>输出</em><em>前</em>k大的<em>数</em>,每个<em>数</em>一行。样例输入10 4 5 6 9 8 7 1 2 3 0 5样例<em>输出</em>9 8 7
假设有N个,找出第K大的K很大(c语言)
比如<em>K</em>=500000,怎么办,还不会堆,栈什么的
n个无序中找出第K大的
遇到题目为从<em>n</em>个无序<em>数</em>组中找出第<em>K</em>大的<em>数</em>,最开始想到的就是冒泡<em>排序</em>、选择<em>排序</em>等,每次<em>找到</em>一个最大(或最小)的,但是很明显需要时间复杂度为O(<em>n</em>*k)!具体代码细节参考fi<em>n</em>d<em>K</em>_2 改进一点的算法有根据快速<em>排序</em>的思想,时间复杂度达到O(<em>n</em>)。想象一下,第k大,说明<em>前</em>面有k-1个元素是比第k个元素大,那么利用快速<em>排序</em>的思想,将大于轴值(暂且固定第一个元素)的放在左边,小于轴值的放在右边...
若有N个无序字,设计算法查找其中第K大的字,并估计算法的复杂度
可以用简单选择<em>排序</em>或者冒泡找出第k大的元素,当N很大时时间复杂度趋近于O(N) 也可以用堆<em>排序</em>选出来,时间复杂度O(<em>K</em> Log N) 最优解使用快排,时间复杂度O(N) 用快排划分成两个子集,且当<em>前</em>界限为第x大,若 x &gt; k ,则要找元素为x左边子集中第x-k大的元素,若 x &lt; k ,则要找元素在x右边子集,为第k大元素,若 x = k, 划分元素即为所<em>求</em>,代码: #i<em>n</em>clude...
n中第k大的值
#i<em>n</em>clude&amp;lt;iostream&amp;gt; #i<em>n</em>clude&amp;lt;stdlib.h&amp;gt; #i<em>n</em>clude&amp;lt;time.h&amp;gt; usi<em>n</em>g <em>n</em>amespace std; void quicksort(i<em>n</em>t r[],i<em>n</em>t low,i<em>n</em>t high){     i<em>n</em>t i,j;          if(low&amp;lt;high){         i=low;         j...
N个中的第k个最大值
确定一组N个<em>数</em>中的第k个最大值,这是<em>数</em>据结构和算法分析(java语言描述)中讨论的第一个问题。书中第一章也已给处两种常规思路:1-先将N个<em>数</em>的<em>数</em>组整体进行递减<em>排序</em>,然后返回位置k(<em>数</em>组索引为k-1)上的元素。 2 - 先将N个<em>数</em>的<em>前</em>k个<em>数</em>读入到<em>数</em>组,并将<em>数</em>组递减<em>排序</em>。然后将剩下的元素逐个读入。新元素读取时,如果小于<em>数</em>组中第k个元素则忽略,否则就放入到正确的位置,同时<em>数</em>组中最后一个元素被挤出<em>数</em>组。
PHP输入n输出其中最大的k个
输入<em>n</em>个<em>整<em>数</em></em>,<em>输出</em>其中最大的k个。 例如输入1,2,3,4,5,6,7和8这8个<em>数</em>字,则最大的3个<em>数</em>字为8,7和6。   /**    * 输入<em>n</em>个<em>整<em>数</em></em>,<em>输出</em>其中最大的k个  * @param u<em>n</em>k<em>n</em>ow<em>n</em> $arr <em>n</em>个<em>整<em>数</em></em><em>数</em>组  * @param u<em>n</em>k<em>n</em>ow<em>n</em> $k  最大<em>数</em>量  */ fu<em>n</em>ctio<em>n</em> test2($arr,$k){    $le<em>n</em> = cou<em>n</em>t($...
Leetcode-215:一个组中第k大的
题目描述 给定一个未<em>排序</em>的<em>整<em>数</em></em><em>数</em>组,<em>找到</em>其中第k大的<em>数</em> 样例: 给出<em>数</em>组[4,5,1,2,3]和k=3,返回3; 给出<em>数</em>组[7,9,4,5]和k=1,返回9. 要<em>求</em>时间复杂度为O(<em>n</em>),空间复杂度为O(1) 分析 快排–不用完全快排完成: 因为快排每次将<em>数</em>组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如果比枢纽元素下标大就从右边的子<em>数</em>组中找,如果比枢...
K小/大的(树状组解法)
<em>求</em>第<em>K</em>小/大<em>数</em>这个题目经常出现,面试,考试以及OJ上都有类似的题目。 首先声明一点,个人觉得既然是第<em>K</em>小(大是一样的),那么重复的元素就不应该算了,当然如果算了就相对简单一些。。 最原始的解法,快排,然后取第<em>K</em>个<em>数</em>。或者是构建一个小顶堆,遍历<em>数</em>组取最小的<em>K</em>个<em>数</em>,再然后还有所谓的快速选择,有人证明了可以在O(<em>n</em>)时间内解决,不过我不太清楚这种算法是否对重复元素有效(但看了代码其实就是快排的一种应
N个k个大的
解题思路:一般思路就是将N个<em>数</em><em>排序</em>后,取<em>前</em>k个<em>数</em>就ok。但是如果N个<em>数</em>是几十亿个<em>数</em>,加载不到内存怎么办?这时候就需要利用堆来解决这个问题具体的思路是:先建一个k个<em>数</em>的小堆,然后从k+1个<em>数</em>往后的值与堆顶元素比较,若此<em>数</em>比堆顶元素大,就将堆顶元素用这个<em>数</em>替换,然后重新调整堆,以此向后重复上述过程,直到将N个<em>数</em>比较完成,那么此时组成这个堆的k个元素就是<em>前</em>k个大的<em>数</em>。接下来我们讲一下最小堆与最大对堆的思...
给定两个排序好的组中第k大的
这个问题比<em>求</em>两个长度相等的<em>排序</em><em>数</em>组的上中位<em>数</em>难度要高一点,难就难在不是<em>求</em>中位<em>数</em>了,但是我们要学会举一反三,可以尝试通过分析将<em>求</em>第k大的<em>数</em>转化为<em>求</em>中位<em>数</em>。将<em>数</em>组中不可能的<em>数</em>排除,在剩下可能的<em>数</em>中<em>求</em>中位<em>数</em>,这样就会产生3情况: 首先声明:两个<em>数</em>组,长度唱的为le<em>n</em>l,长度短的为le<em>n</em>s。 1.k&lt;le<em>n</em>s; 2.le<em>n</em>s&lt;k&lt;le<em>n</em>l 3,le<em>n</em>l&lt;k&lt;le<em>n</em>l+...
分治算法N个中第K小(大)的
这个学期开算法课,跟着进度写写代码就好。这周讲分治,说到了<em>求</em>N个<em>数</em>中第<em>K</em>小(大)<em>数</em>的问题,写写看。 分治算法的复杂度是O(<em>n</em>),用到了快速<em>排序</em>的思路:先选取一个参考<em>数</em>进行一次快排,拿升序来说的话,快排之后左边所有<em>数</em>参考<em>数</em>,然后根据左右部分各自包含元素的个<em>数</em>,计算要<em>求</em>的元素在哪个区间内(要<em>求</em>的元素或是左区间中的第k小<em>数</em>,或是右区间中第[k-j]小<em>数</em>,j为左区间的长度),然后递归<em>求</em>解。 本来pku
第k大的(用快排思想 - java实现)
有一个<em>整<em>数</em></em><em>数</em>组,请你根据快速<em>排序</em>的思路,找出<em>数</em>组中第<em>K</em>大的<em>数</em>。 给定一个<em>整<em>数</em></em><em>数</em>组a,同时给定它的大小<em>n</em>和要找的<em>K</em>(<em>K</em>在1到<em>n</em>之间),请返回第<em>K</em>大的<em>数</em>,保证答案存在。 测试样例: [1,3,5,2,2],5,3 返回:2 思路: 利用快排的思想,取一个关键值,将其进行一趟快排之后,比它大的<em>数</em>都放到它左边,比他小的<em>数</em>都放到右边 要<em>求</em>第k大的<em>数</em>,就是<em>求</em><em>数</em>组下标为k-1的<em>数</em>值 首先获取关键值的...
三种方法寻找K个最大的
package com.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; //给定一个长度为<em>n</em>的<em>数</em>组,寻找其中最大的k个<em>数</em> public class Fi<em>n</em>d<em>K</em>thEleme<em>n</em>ts { //算法一:<em>排序</em>,时间复杂度O(<em>n</em>log<em>n</em>),空间复杂度O(1) public Arr...
快速排序&半快速排序思想n个无序中第k或者k个
一、快速<em>排序</em>总结:   给快速<em>排序</em>做个总结是看到之<em>前</em>上<em>数</em>据结构的时候给老师写的一个关于考试程序纠错的邮件。错误的程序如下: void QuickSort(RecType R[],i<em>n</em>t s,i<em>n</em>t t) { i<em>n</em>t i=s,j=t; RecType tmp; if (s<t) { tmp=R[s]; while (i!=j) {
找出N个中最大的K
如题:给出N个<em>整<em>数</em></em>(N可能很大,以致无法装入内存),找出<em>前</em><em>K</em>个最大的<em>整<em>数</em></em> 【解法一】 当学生们信笔写下 float array [10000000],他们往往没有想到这个<em>数</em>据结构 要如何在电脑上实现,是从当<em>前</em>程序的栈(Stack)中分配,还是堆(Heap), 还是电脑的内存也许放不下这么大的东西? 我们先假设元素的<em>数</em>量不大,例如在几千个左右,在这种情况下,那我们就<em>排序</em>一下吧。在这里,快速
据结构练习】 区间第K的几种方法
这类<em>求</em><em>数</em>列上区间第<em>K</em>大<em>数</em>的题目非常非常多。 比如HDOJ 2665,SOJ 3147,POJ 2104,POJ 2761(区间不包含)。 当然<em>求</em>解这个问题的方法也非常多,所以在这里做一下总结。
出一个列的第k小的
这是小弟的源代码。 具体运行例子如下(cmd环境下): 5 3 1 2 3 4 5 0 0 这串<em>数</em>据的<em>输出</em>是 Data set 1: eleme<em>n</em>t 3 is 3 简单来讲就是5是<em>数</em>组长度,3是指第k
算法题(一)--找出组中第k大的输出其下标(组中的有重复)
有时候会突然被问到一些算法题,也是面试经常被问的思路问题吧,毕竟是师兄们面试回来说的面试考题。在这一系列呢,打算把自己每次被问到的仔细思考过的一些题都总结下来。方便自己去温习吧,也给大家参考一下我的思路。文章结构:(1)题目描述;(2)快排思路解法;(3)堆排思路解法;(4)其他解法思路待续。
算法题 K大的
题目描述:在乱序<em>数</em>组中<em>求</em>第<em>K</em>大的<em>数</em> 思路:立刻想到的是当然先<em>排序</em>然后取<em>数</em>。但是提问者明显不是想这么解。上网查了下原来是快排思路。 利用快排的思想,从<em>数</em>组arr中随机找出一个元素X,把<em>数</em>组分成两部分arr_a和arr_b。 arr_a中的元素比x大,arr_b中的元素比x小。 这个时候分为两种情况: 1.arr_a中的元素个<em>数</em>小于<em>K</em>,则第<em>K</em>大<em>数</em>在arr_b中 2.arr_a中的元素大于...
java 实现从无序组中 找出第k大的, 无序组充许有重复元素
要<em>求</em>找出第几名的元素是什么(找出B[i]的值)? 找出第k名的元素的值。          先从A中随机一个下标i<em>n</em>dex1, 然后进行一趟快速<em>排序</em>等到新<em>数</em>组A1,排完了就知道i<em>n</em>dex1对应的元素在A1中的新下标i<em>n</em>dex2. 如果k等于i<em>n</em>dex2,则A1[i<em>n</em>dex2]就是要找的值。 如果 k小于i<em>n</em>dex2 ,则在A1的以i<em>n</em>dex2为分界的左部分去找。 如果 k大于i<em>n</em>dex2
海量据处理 - 10亿个中找出最大的10000个(top K问题)
[size=small] <em>前</em>两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个<em>数</em>建堆,然后一次添加剩余元素,如果大于堆顶的<em>数</em>(10000中最小的),将这个<em>数</em>替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个<em>数</em>就是所需...
分治专题 输出k大的
给定一个<em>数</em>组,统计<em>前</em>k大的<em>数</em>并且把这k个<em>数</em>从大到小<em>输出</em>。 分治:把一个问题分解成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只需要选一部分完成。然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成。 把<em>前</em>m大的都弄到<em>数</em>组的右边,然后对最右边的m个元素<em>排序</em>再<em>输出</em>。 O(<em>n</em>)时间内实现把<em>前</em>m大的都弄到<em>数</em>组最右边。 arra<em>n</em>geRi<em>n</em>ght(i<em>n</em>t l, i<em>n</em>...
一个组中K大的或者第K大的
#i<em>n</em>clude usi<em>n</em>g <em>n</em>amespace std; void BubbleSort(i<em>n</em>t a[], i<em>n</em>t ale<em>n</em>) { for(i<em>n</em>t i = 0; i < ale<em>n</em>; i++) { for(i<em>n</em>t j = ale<em>n</em>-1; j > i; j--) { if(a[j] > a[j-1])
n中选出第k大的——简单随机选择
#i<em>n</em>clude &amp;lt;iostream&amp;gt; #i<em>n</em>clude &amp;lt;algorithm&amp;gt; #i<em>n</em>clude &amp;lt;cstdio&amp;gt; #i<em>n</em>clude &amp;lt;cstdlib&amp;gt; #i<em>n</em>clude &amp;lt;cstri<em>n</em>g&amp;gt; #i<em>n</em>clude &amp;lt;cmath&amp;gt; #i<em>n</em>clude &amp;lt;queue&amp;gt; #i<em>n</em>clude &amp;lt;stack&amp
在无序组中找第k大的字—滴滴笔试
滴滴2017校招笔试题目——在无序<em>数</em>组中<em>找到</em>第<em>K</em>大<em>数</em>字: 方法一:比较巧妙,利用multiset自动<em>排序</em>(从小到大)的特性,建立一个k大小的multiset,然后从头遍历<em>数</em>组,如果当<em>前</em><em>数</em>字>multiset.begi<em>n</em>(),则删除multiset.begi<em>n</em>(),并插入当<em>前</em><em>数</em>字。最终multiset.begi<em>n</em>()就是结果。 #i<em>n</em>clude #i<em>n</em>clude #i<em>n</em>clude #i<em>n</em>c
取一组无序组中第k大的
方法1.:维持一个大小为k最小堆, 后面来的<em>数</em>小或者等于堆顶元素,则跳过,; 后面来的<em>数</em>大于堆顶元素,堆顶元素弹出,新元素加入最小堆   最后留下的k个<em>数</em>就是,所有<em>数</em>中<em>前</em>k大的<em>数</em>,堆顶元素就是第k大的<em>数</em> 时间复杂度:由于维持大小为k的堆花费时间为log(k),所以时间复杂度为<em>n</em>log(k). 代码如下: //构建最小堆,当<em>前</em><em>数</em>比父结点小就往上冒 void bulidMi<em>n</em>Heap(i...
n中第k大的、快速排序
<em>求</em><em>n</em>个<em>数</em>中第k大的<em>数</em>、快速<em>排序</em> 分类: <em>数</em>据结构和算法 2011-05-29 15:45 41人阅读 评论(0) 收藏 举报 <em>求</em><em>n</em>个<em>数</em>中第k大的<em>数</em> view plai<em>n</em> #i<em>n</em>clude   #i<em>n</em>clude   /**  *<em>求</em>一个<em>数</em>
找出第K大的
一:问题描述 输入一组<em>数</em>字,找出其中第<em>K</em>大的<em>数</em>。 二:源代码 第一种方法:<em>排序</em> #i<em>n</em>clude usi<em>n</em>g <em>n</em>amespace std; i<em>n</em>t mai<em>n</em>(){ i<em>n</em>t <em>n</em>,k; ci<em>n</em> >> <em>n</em> >>k; i<em>n</em>t <em>n</em>um[1000]; for(i<em>n</em>t i=0;i> <em>n</em>um[i]; } for(i<em>n</em>t i=0;i<<em>n</em>-1;i++)
007-寻找第k小元素-分治法-《算法设计技巧与分析》M.H.A学习笔记
在<em>n</em>个元素的<em>数</em>组中查找第k小的元素。Θ(<em>n</em>)
第k小(快排)
快速<em>排序</em>的基本思想: (1)分解:以a[p]为基准元素将a[p:r]划为3段a[p:q-1],a[q]和a[q+1:r],使得a[p:q-1]中任何元素小于等于a[q],a[q+1:r]中任何元素大于等于a[q]。下标q在划分过程中确定。 (2)递归<em>求</em>解:通过递归调用快排算法,分别对a[p:q-1]和a[q+1:r]进行<em>排序</em>。 (3)合并:由于a[p:q-1]和a[q+1:r]都已经排好序了
找出第k大的
问题: 从一个<em>数</em>组里面,找出第<em>K</em>大的<em>数</em>。 题目很简单,要想把第<em>K</em>个<em>数</em>找出来,其实也挺容易的。 第一种方法:无非就是先<em>排序</em>,比如用Merge Sort算法,整个算法复杂度为 O(NlgN), 然后<em>找到</em>第<em>K</em>个即可。 第二种方法:如果k很小,比如第五个最大的<em>数</em>,而整个<em>数</em>组的长度非常的大,那么,还有一种方法就是,我做k遍找最大的<em>数</em>,每做一遍,就把最大的放在<em>数</em>组的最后面,然后减少<em>数</em>组扫描的范围,就可...
K问题
“第/<em>前</em>k大<em>数</em>问题”指的是在长度为<em>n</em>(<em>n</em>>=k)的乱序<em>数</em>组S中找出从大到小顺序的第k个<em>数</em>的问题(当然类似地也有“第<em>K</em>小<em>数</em>问题”)。下面是几种常见解决方法。 解法1: 我们可以对这个乱序<em>数</em>组按照从大到小先行<em>排序</em>,<em>排序</em>方法可以根据实际情况选择,最优情况是O(<em>n</em>*log<em>n</em>),然后取出<em>前</em>k大,总的时间复杂度应为O(<em>n</em>*log<em>n</em> + k)。 解法2: 利用选择<em>排序</em>或交互<em>排序</em>,<em>K</em>次选择后就可以得到
无序组找出其中的第K大的
pytho<em>n</em> # -*- codi<em>n</em>g: utf-8 -*- &quot;&quot;&quot; Created o<em>n</em> Sat Sep 23 10:19:24 2017 @author: MLee &quot;&quot;&quot; import ra<em>n</em>dom def partitio<em>n</em>(arr, low, high): pivot = arr[low] while low &amp;lt; high: whil...
快排应用—第k大的
利用快速<em>排序</em>来查找无序<em>数</em>组中第<em>K</em>大的<em>数</em>,通过判断下标,只计算有k的那一半,时间复杂度为 O(<em>n</em>). #i<em>n</em>clude&amp;lt;iostream&amp;gt; usi<em>n</em>g <em>n</em>amespace std; co<em>n</em>st i<em>n</em>t max<em>n</em>=256; i<em>n</em>t Partitio<em>n</em>(i<em>n</em>t A[],i<em>n</em>t left,i<em>n</em>t right) { i<em>n</em>t temp=A[left]; while(left&amp;lt;rig...
n中第k大
#i<em>n</em>clude #i<em>n</em>clude #i<em>n</em>clude usi<em>n</em>g <em>n</em>amespace std; i<em>n</em>t ra<em>n</em>dom_partio<em>n</em>(i<em>n</em>t *arry, i<em>n</em>t <em>n</em>) { time_t t; sra<em>n</em>d((u<em>n</em>sig<em>n</em>ed)time(&t)); i<em>n</em>t i<em>n</em>dex=ra<em>n</em>d()%<em>n</em>; swap(arry[i<em>n</em>dex], arry[<em>n</em>-1]); //起到随机
无序组的第k大
给你一个无序<em>数</em>组,<em>求</em>第k大<em>数</em>是多少 c++&amp;lt;fu<em>n</em>ctio<em>n</em>al&amp;gt;库里的函<em>数</em><em>n</em>th_eleme<em>n</em>t(首地址,首地址+k-1,首地址+<em>数</em>组长度); 时间复杂度O(<em>n</em>) 例: #i<em>n</em>clude&amp;lt;algorithm&amp;gt; #i<em>n</em>clude &amp;lt;iostream&amp;gt; #i<em>n</em>clude&amp;lt;cstri<em>n</em>g&amp;gt; #i<em>n</em>clude &amp;lt;cstdio&amp;gt; #i...
NOI 2.4 分治 7617:输出k大的
题目来源:http://<em>n</em>oi.ope<em>n</em>judge.c<em>n</em>/ch0204/76177617:<em>输出</em><em>前</em>k大的<em>数</em>总时间限制: 10000ms   单个测试点时间限制: 1000ms  内存限制: 65536kB描述给定一个<em>数</em>组,统计<em>前</em>k大的<em>数</em>并且把这k个<em>数</em>从大到小<em>输出</em>。输入第一行包含一个<em>整<em>数</em></em><em>n</em>,表示<em>数</em>组的大小。<em>n</em> &amp;lt; 100000。第二行包含<em>n</em>个<em>整<em>数</em></em>,表示<em>数</em>组的元素,<em>整<em>数</em></em>之间以一个空格分开。每个<em>整<em>数</em></em>...
从一个序列中获取K大的的一种方法
这个方法是利用快速<em>排序</em>的。在快速<em>排序</em>中,得到中间元素(pivot)之后,比较中间元素之<em>前</em>的元素个<em>数</em>和<em>K</em>的大小关系,从而确定后面该往哪个方向继续递归。如果中间元素<em>前</em>面的元素个<em>数</em>等于<em>K</em>,那就停止递归过程;如果中间元素<em>前</em>面元素个<em>数</em>小于<em>K</em>,那就再中间元素后面进行递归;否则就往中间元素<em>前</em>面进行递归。这样最终得到的是没有<em>排序</em>的<em>前</em><em>K</em>大的元素,这样再对<em>前</em><em>K</em>个元素进行一次真正的快速<em>排序</em>。这样就能得到排好序的<em>前</em><em>K</em>大元
算法篇之分治算法--输出k大个
例题3:<em>输出</em><em>前</em>k大的<em>数</em> 描述:给定一个<em>数</em>组包含<em>n</em>个元素,统计<em>前</em>k大的<em>数</em>并且把这k个<em>数</em>从大到小<em>输出</em>。 输入:第一行包含一个<em>整<em>数</em></em><em>n</em>,表示<em>数</em>组的大小。<em>n</em>&amp;lt;100000 第二行包含<em>n</em>个<em>整<em>数</em></em>,表示<em>数</em>组的元素,<em>整<em>数</em></em>之间以一个空格分开。每个<em>整<em>数</em></em>的绝对值不超过100000000. 第三行包含一个<em>整<em>数</em></em>k,k&amp;lt;<em>n</em>. <em>输出</em>: 从大到小<em>输出</em><em>前</em>k大的<em>数</em>,每个<em>数</em>一行。   解析: 引入操作arr...
(分治)7617:输出k大的
描述给定一个<em>数</em>组,统计<em>前</em>k大的<em>数</em>并且把这k个<em>数</em>从大到小<em>输出</em>。 输入第一行包含一个<em>整<em>数</em></em><em>n</em>,表示<em>数</em>组的大小。<em>n</em> &lt; 100000。第二行包含<em>n</em>个<em>整<em>数</em></em>,表示<em>数</em>组的元素,<em>整<em>数</em></em>之间以一个空格分开。每个<em>整<em>数</em></em>的绝对值不超过100000000。第三行包含一个<em>整<em>数</em></em>k。k &lt; <em>n</em>。 <em>输出</em>从大到小<em>输出</em><em>前</em>k大的<em>数</em>,每个<em>数</em>一行。 样例输入104 5 6 9 8 7 1 2 3 05 样例...
快速排序K 大的或第 K 小的
众所周知,快速<em>排序</em>可以通过每一趟<em>排序</em>将指定元素放在它应该在的位置,也就是它左边的元素都比他小,右边的元素都比他大。根据这个原理,利用快速<em>排序</em><em>求</em>第 <em>K</em> 大的<em>数</em>或者第 <em>K</em> 小的<em>数</em>就很方便了。在实现的时候,并不需要完整地实现快排的所有过程。假如我们要找的是第 <em>K</em> 大的<em>数</em>,而一趟快排后 a[low] 这个元素被放在了指定位置,那就只需要看 <em>K</em> 和 low 的大小关系来决定递归 low 的左边部分还是右边部...
基本算法之分治——输出K大的(1)
问题 给定一个<em>数</em>组,统计<em>前</em>k大的<em>数</em>并且把这k个<em>数</em>从大到小<em>输出</em>。 输入 第一行包含一个<em>整<em>数</em></em><em>n</em>,表示<em>数</em>组的大小。<em>n</em> &amp;amp;lt; 100000。 第二行包含<em>n</em>个<em>整<em>数</em></em>,表示<em>数</em>组的元素,<em>整<em>数</em></em>之间以一个空格分开。每个<em>整<em>数</em></em>的绝对值不超过100000000。 第三行包含一个<em>整<em>数</em></em>k。k &amp;amp;lt; <em>n</em>。 <em>输出</em> 从大到小<em>输出</em><em>前</em>k大的<em>数</em>,每个<em>数</em>一行。 样例输入 10 4 5 6 9 8 7 1 2...
在N个乱序字中查找第k大的
在N个乱序<em>数</em>字中查找第k大的<em>数</em>字 在N个乱序<em>数</em>字中查找第k大的<em>数</em>字,时间复杂度可以减小至  O(N*logN) O(N) O(1) O(2) 答案:B   所谓“第(<em>前</em>)k大<em>数</em>问题”指的是在长度为<em>n</em>(<em>n</em>>=k)的乱序<em>数</em>组中S找出从大到小顺序的第(<em>前</em>)k个<em>数</em>的问题。 注意:题中只需得到最大的<em>K</em>个<em>数</em>,而不需要对后面N-<em>K</em>个<em>数</em><em>排序</em> 
无序K
i<em>n</em>t fi<em>n</em>d<em>K</em>thLargest(i<em>n</em>t []<em>n</em>ums, i<em>n</em>t k) { i<em>n</em>t m = <em>n</em>ums.le<em>n</em>gth; k = m - k; retur<em>n</em> helper(<em>n</em>ums, 0, m - 1, k); } i<em>n</em>t helper(i<em>n</em>t []<em>n</em>ums, i<em>n</em>t left, i<em>n</em>t right, i<em>n</em>t k) { ...
找第K
#i<em>n</em>clude&amp;lt;bits/stdc++.h&amp;gt; usi<em>n</em>g <em>n</em>amespace std; void Fi<em>n</em>d_k<em>n</em>umber(i<em>n</em>t *A,i<em>n</em>t l,i<em>n</em>t r,i<em>n</em>t k){ if(l == r)retur<em>n</em> ; i<em>n</em>t imp = A[l]; //左边作为枢轴 i<em>n</em>t i = l,j = r; while(i != j){ ...
《算法笔记》4.7小节——算法初步->其他高效技巧与算法 问题 A: 第k大
                                           问题 A: <em>求</em>第k大<em>数</em> 题目描述 给定一个长度为<em>n</em>(1≤<em>n</em>≤1,000,000)的无序正<em>整<em>数</em></em>序列,以及另一个<em>数</em>k(1≤k≤1,000,000)(关于第k大的<em>数</em>:例如序列{1,2,3,4,5,6}中第3大的<em>数</em>是4。) 输入 第一行两个正<em>整<em>数</em></em>m,<em>n</em>。 第二行为<em>n</em>个正<em>整<em>数</em></em>。 <em>输出</em> 第k大的<em>数</em>。 样例输入...
k大
#i<em>n</em>clude&amp;lt;stdio.h&amp;gt; #i<em>n</em>clude&amp;lt;iostream&amp;gt; usi<em>n</em>g <em>n</em>amespace std; co<em>n</em>st i<em>n</em>t max<em>n</em> = 500000 + 5; // 找第<em>K</em>大的<em>数</em> // m,<em>n</em>表示所需要<em>排序</em>部分的首尾索引 void fi<em>n</em>d<em>K</em>thBigger(i<em>n</em>t a[], i<em>n</em>t <em>K</em>, i<em>n</em>t m,i<em>n</em>t <em>n</em>) { i<em>n</em>t i=m,j=<em>n</em>; ...
n中第k大的K大的、快速排序
<em>求</em><em>n</em>个<em>数</em>中第k大的<em>数</em> #i<em>n</em>clude #i<em>n</em>clude /** *<em>求</em>一个<em>数</em>组中的第k大<em>数</em> *基本思想: *以最后一个元素x为轴,把<em>数</em>组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况: *1.Sa中元素的个<em>数</em>小于k,则Sb中的第k-|
寻找第K大的(快排思想)
使用快排思想找第<em>K</em>大的<em>数</em>,算法复杂度O(<em>n</em>)。1.以<em>数</em>组a的第0位a[0]为参考基准base,将<em>数</em>组划分为两个部分; 如果找第<em>K</em>大的<em>数</em>,则将大于base的<em>数</em>往<em>前</em>挪,将小于base的<em>数</em>往后挪。如果找第<em>K</em>小的<em>数</em>,则与此相反。 划分过程与快排相同,使用两个指针i和j分别指向<em>数</em>组的首尾,根据指针所指元素与基准base的大小交替移动两个指针,直到两个指针指向同一个位置i==j,此时i或j即为base的下标
找出一个组里面K个最大
<em>前</em>言:今天早上来实验室,同桌问了我一个问题:找出一个<em>数</em>组里面<em>前</em><em>K</em>个最大<em>数</em>的高效算法。最近正好在看<em>数</em>据结构和算法相关内容,便以己之力帮她思考了思考。 问题:找出一个<em>数</em>组里面<em>前</em><em>K</em>个最大<em>数</em>。 解法: 1.第一感觉就是对<em>数</em>组进行降序全<em>排序</em>,然后返回<em>前</em><em>K</em>个元素,即是需要的<em>K</em>个最大<em>数</em>。 <em>排序</em>算法的选择有很多,考虑<em>数</em>组的无序性,可以考虑选择快速<em>排序</em>算法,其平均时间复杂度为O(NLogN)。具体代
寻找K
寻找<em>前</em><em>K</em>大<em>数</em>,虽然这个问题已经被做烂了,但是无意中看到之<em>前</em>A题时候的一个代码,还是忍不住改了改想提高下效率,从O(NlogN)降到O(<em>K</em>logN)。 当时用的是很简单的冒泡和sort,恩,也就是对<em>数</em>组全部元素<em>排序</em>,复杂度O(NlogN), 但是当<em>K</em>很小时,比如题目中<em>K</em><=10的情况无疑浪费了。因此用quicksort的思路,每次将<em>数</em>组partitio<em>n</em>成两部分,一边<key,一边>key。然后迭代地找<em>前</em>k大<em>数</em>。
选择问题-输出第k大的
#i<em>n</em>clude #i<em>n</em>clude void sqe<em>n</em>ci<em>n</em>g(double a[],i<em>n</em>t <em>n</em>); i<em>n</em>t selectkmax(double a[],i<em>n</em>t <em>n</em>,i<em>n</em>t k); i<em>n</em>t mai<em>n</em>() { i<em>n</em>t <em>n</em>umber = 0; i<em>n</em>t i = 0; i<em>n</em>t k = 0; double *a = NULL; pri<em>n</em>tf("请输入<em>数</em>组元素
总结 -- 寻找最大的K,寻找第K大的
一、在N个<em>数</em>中,寻找最大的<em>K</em>个<em>数</em> 这里只考虑<em>K</em>不等于1的情况,<em>K</em> = 1时,可以通过N - 1次比较和交换得到结果。   1. N不大的情况下,几千个左右。 ① 先<em>排序</em>,快速<em>排序</em>或者堆<em>排序</em>,平均复杂度为O(N*log2N),再取出<em>前</em><em>K</em>个,O(<em>K</em>)。总时间复杂度,O(N*log2N) + O(<em>K</em>) =O(N*log2N) ;    ② 若<em>K</em> 2N,可以进行部分<em>排序</em>(选择<em>排序</em>和冒泡<em>排序</em>)。
寻找k大的
I<em>n</em>put 输入有多个测试用例,每个测试用例是两行: 第1行是两个<em>整<em>数</em></em>N和<em>K</em>,中间用空格隔开(N ≥ <em>K</em>) 第2行有N个<em>整<em>数</em></em>,每两个<em>数</em>字中间用空格隔开 输入以EOF结束 Output 对于每一个测试用例,<em>输出</em>一行,<em>K</em>个<em>整<em>数</em></em>,就是它的<em>前</em><em>K</em>大的<em>整<em>数</em></em>,按照降序排列<em>输出</em>,每两个<em>数</em>字之间用空格隔开,最后一个<em>数</em>字后面没有空格,有换行。 Sample I<em>n</em>put 5 2
若干个(大量)字中找K大/小的元素--值型
方法一:根据快速<em>排序</em>划分的思想 : (1) 递归对所有<em>数</em>据分成[a,b)b(b,d]两个区间,(b,d]区间内的<em>数</em>都是大于[a,b)区间内的<em>数</em> ; (2) 对(b,d]重复(1)操作,直到最右边的区间个<em>数</em>小于100个。 注意[a,b)区间不用划分 ;因为[a,b)区间一定小于(b,d]区间; (3) 返回上一个区间,并返回此区间的<em>数</em>字<em>数</em>目。 如果个<em>数</em>大于100,对(b,d]重复(1)操作,直到最右边的区间个<em>数</em>小于100个; 如果个<em>数</em>小于100,对上一区间的左边进行划分,分为
寻找第k大
1003. 寻找第k大<em>数</em>字(<em>n</em>umberk)
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
IDA代码破解揭秘下载
好不容易找到的一本电子书,PDF格式的,是难得的关于IDA详细介绍的一本实用手册。 相关下载链接:[url=//download.csdn.net/download/kxltsuperr/4566048?utm_source=bbsseo]//download.csdn.net/download/kxltsuperr/4566048?utm_source=bbsseo[/url]
凯立德算号器J0A-J0B下载
可用于 凯立德地图升级 J0A J0A程序+J0B地图 相关下载链接:[url=//download.csdn.net/download/xtwxj/4741304?utm_source=bbsseo]//download.csdn.net/download/xtwxj/4741304?utm_source=bbsseo[/url]
Skyline6-Terraexplorer-BS 中文开发问题整理下载
Skyline6-Terraexplorer-BS 中文开发问题整理及使用总结 相关下载链接:[url=//download.csdn.net/download/hxtxyds001/10535745?utm_source=bbsseo]//download.csdn.net/download/hxtxyds001/10535745?utm_source=bbsseo[/url]
我们是很有底线的