寻找第K大的数(快速排序的应用)】的更多相关文章

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数.给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在.测试样例:[1,3,5,2,2],5,3 http://blog.csdn.net/hymanxq/article/details/51026818 public class 寻找第K大的数 { public static void main(String[] args) { // TODO Auto-generated method…
在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,解决这个问题的方法很多. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题. 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k).      解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数.总的时间复杂度为O(n*k)      解法3: 利用快速排序的思想,从数组…
利用快速排序的思想·去做 #include<iostream>using namespace std;int FindKthMax(int*list, int left, int right, int k);int main(){ int i,n,k; while (cin >> n){ int *a = new int[n]; for (i = 0; i < n; i++) cin >> a[i]; cin >> k; cout << F…
时间复杂度 O(n) def partition(data,left,right): if (len(data)<=0 or left<0 or right>=len(data)): print("Invalid parametres,please check!") temp = data[left] i = left j = right while (i != j): while (data[j]>=temp and i<j): j = j-1 whil…
参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可以确定一个数组中第k大的元素. 算法思想描述如下: 1.将输入n个元素划分为(n/5:向下取整)个组,每组有5个元素.而只有最后一组为数组剩下的(n mod 5)个元素组成. 2.寻找这些组的中位数:通过对每一个小组进行插入排序,确定中位数.保存到数组mid_arr中.(下标:第i组中位数存在第i位…
参考:https://minenet.me/2016/08/24/quickSort.html 快速排序 利用分治法可将快速排序的分为三步: 在数据集之中,选择一个元素作为"基准". 所有小于"基准"的元素,都移到"基准"的左边:所有大于"基准"的元素,都移到"基准"的右边.这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置. 对"基准&quo…
[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值.   名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家.       所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的…
问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include<iostream>#include<algorithm>using namespace std;bool cmp(int a, int b){ return a > b; }int main(){ int k; int a[9] = { 6, 5, 9, 8, 2, 1, 7, 3…
快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a,left,right);//选出key下标 if(left<key){ quickSort(a,left,key-1);//对key的左半部分排序 } if(key<right){ quickSort(a,key+1,right)//对key的右半部份排序 } } function partiti…
[算法] 选取pivot,然后每趟快排用双指针扫描(l,r)区间,交换左指针大于pivot的元素和右指针小于pivot的元素,将区间分成大于pivot和小于pivot的 [注意] 时间复杂度取决于pivot的选取是否能把(l,r)区间分成长度相等的两个子区间. 最优:O(nlogn) 最差:O(n2) 问题解决: 版本一:pivot选择区间中间的元素可以解决数组本身就已经排好序的问题,但是无法解决数组中每个元素均相等(第五个点tle) #include <bits/stdc++.h> usin…
题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respectively, design an algorithm to find the kth largest key. The order  of growth of the worst case running time of your algorithm should be logn, where n…
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每个整数的绝对值不超过100000000.第三行包含一个整数k.k < n. 输出 从大到小输出前k大的数,每个数一行. 样例输入 10 4 5 6 9 8 7 1 2 3 0 5 样例输出 9 8 7 6 5 分…
问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. 只需找到第k大的数,不必把所有的数排好序.我们借助快速排序中partition过程,一般情况下,在把所有数都排好序前,就可以找到第k大的数.我们依据的逻辑是,经过一次partition后,数组被pivot分成左右两部分:S左.S右.当S左的元素个数|S左|等于k-1时,pivot即是所找的数:当|S…
(找第k大的数) 给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1<=n<=1000000),接下来以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4). #include <iostream> using namespace std; int a[1000001],n,ans = -1; void swap(int &a,int &b) { int c; c = a; a = b; b…
一  问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二  举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2, -9],请找出第 5 大的数(容易知道是0). 三   算法思路:        一种基于快排思想的算法可以在 O(n) 复杂度内找到第k大的数,首先要知道 partition 这个函数,它可以调整一个序列 使小于 key 的元素都排在 key 左边,大于 key 的元素都排在 key 右边,key 可以…
问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路.看网上写了一堆解法,但是将思路说得非常清楚的少之又少. 有两种思路,一个是算法导论里面的,一个是求解k大元素.建议使用下面第二种思路,代码少不容易出错. 下面的内容摘自:https://blog.csdn.net/hackbuteer1/article/details/7584838 求解中位数,算…
使用类似快速排序,执行一次快速排序后,每次只选择一部分继续执行快速排序,直到找到第K个大元素为止,此时这个元素在数组位置后面的元素即所求 时间复杂度: 1.若随机选取枢纽,线性期望时间O(N) 2.若选取数组的“中位数的中位数”作为枢纽,最坏情况下的时间复杂度O(N) 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb.Sa中的元素大于等于X,Sb中元素小于X.这时有两种情况:            1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大…
问题描述:输入一组数,指定一个k,输出这组数里第k大的数. 一般这种题目,第一想法是把整个数组先排序后,再选取第k位的数.但是这样做实际上浪费了大量的时间在排序上,我们只是要求第k大的数,并非要把整个数组排序完. 利用快速排序算法的性质:每一趟排序,必有一个元素位于最终的位置,而且于此同时这个元素左边部分的元素都比它小,右边部分的元素都比它大,在这个算法的基础上加以修改:我们直接将每次选取的元素最终所在位置m与我们想要比较的位置号k相比较.若m比k大,说明第k大元素必然在m的左方,此时缩小下一趟…
问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组都排序了,而实际上我们不需要这样做. 解法二(K数组排序): 首先,创建一个长度为K的空数组.从原数组中先挑出K个数进行排序并放到这个空数组中.这一步的时间复杂度是O(Klog(K)). 接着,从剩下的N-K个值中,依次遍历并与上面数组的末尾的数(即里面的最大数)相比较,并插入到合适位置,需要执行(…
原创 利用到快速排序的思想,快速排序思想:https://www.cnblogs.com/chiweiming/p/9188984.html array代表存放数列的数组,K代表第K大的数,mid代表一趟快速排序后返回的基准记录下标: 一趟快速排序下来若基准记录存在的位置满足:array.length-mid==K,则说明array[mid]即是第 K大的数,若小于K,说明第K大的数在区间 [ left , mid-1 ],大于K说明在区间 [ mid+1,right ]: import jav…
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2   投机取巧能通过: class Finder { public: int findKth(vector<int> a, int n, int K) { // write code here sort(a.begin(), a.end()); return a[n - K];…
传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 note: 注意手写快排的时候: while(i < j) { while(j > i && a[j] > a[left]) j--; while(i < j && a[i] <= a[left]) i++; if(i…
描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每个整数的绝对值不超过100000000.第三行包含一个整数k.k < n.输出从大到小输出前k大的数,每个数一行.样例输入 10 4 5 6 9 8 7 1 2 3 0 5 样例输出 9 8 7 6 5 排序后再输出,复杂度 O(nlogn)用分治处理: 复杂度 O(n+mlogm)思路:把前m大的都弄到数…
这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了第k个位置,那么前k-1个数都要比第k个数小. 后面的数都要比第k个位置上的数要大.所以当前第k个位置上的数就是第K小的数 1.NYOJ 678 最小K个数之和 这道题的时间放得比較松,不要求线性时间,所以用方法一也是能够的 /* * ksmall1.cpp * * Created on: 2014…
题目描述 给定一个无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4). 输入格式 输入包括两行,第一行包括两个正整数n和k,n代表有n个正整数,k代表要查找第k大的数. 第二行有n个正整数.每个正整数的范围是1~1000000. 其中,n的范围是1~1000000,k的范围是1~n 输出格式 输出第k大的数. 样例输入 6 3 1 2 3 4 5 6 样例输出 4…
问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArray 堆解法 设置一个小根堆,先把前K个数放入小根堆,对于这前K个数来说,堆顶元素一定是第K大的数,接下来的元素继续入堆,但是每入一个就弹出一个,最后,堆顶元素就是整个数组的第K大元素.代码如下: public static int findKthLargest3(int[] nums, int k)…
传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Accepted: 2847 Description Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is really huge, Newman wants…
1175 区间中第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,k = 2,对应的数为7 6 3,第2大的数为6.   Input 第1行:1个数N,表示序列的长度.(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应序列中的元素.(0 <= S[i]…
裸的主席树. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) int…
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 先排序,二分上下界分别是最小的两个数和最大的两个数的乘积.注意到一个性质,就是a[i]*b[j],i从左到右,j从右到左.假如遇到一组a[i]*b[j]<=x,j就不必再减小了.这时候比x小的数一定是j个.下一次继续找i,这个b[j]一定不可能大于b[j+1].问题就由找第k大的数,转换成找第n*n-k+1小的数.每次二分这个乘积x,看看是否符合条件即可…