无序整数数组中找第k大的数

方法一:基于快排

 1 /*
 2 基于区间快排的第K小算法 ,输出a[k-1]即可,O(n*logn);每次只对后半部分递归便可把复杂度降到O(n)
 3 主要思路是每次随机在数组中选取一个元素p,利用这个元素将数组分成两部分,比p小的元素在分好的数组左边,p和比p大的元素在数组右边,
 4 根据k值选择在数组左半或者右半部分继续递归执行查找。
 5 */
 6 #include <iostream>
 7 #include <cstring>
 8 #include <vector>
 9 #include <algorithm>
10 using namespace std;
11
12 void swap(int *p, int *q)
13 {
14     int t;
15     t = *p;
16     *p = *q;
17     *q = t;
18 }
19
20 int findNumberK(vector<int> &vec, int k, int from, int to)
21 {
22     int roll = vec[from], middle = 0, j = from;//roll是指标杆值
23     for(int i = from+1 ; i<= to ; i++)
24     {
25         if(vec[i] < roll)
26         {
27             j++;//roll左边每次被换的元素 的下标
28             swap(&vec[i], &vec[j]);
29             middle++;
30         }
31     }
32     swap(&vec[from], &vec[j]);
33     if(middle == k -1 )
34         return roll;
35     else if (middle < k - 1)
36     {
37         return findNumberK(vec, k - middle - 1, j + 1, to);
38     }
39     else
40         return findNumberK(vec, k, from, j - 1);
41 }
42
43 int main()
44 {
45     vector<int> vec;
46     int temp, k;
47
48     cout << "input data(以0结束):" << endl;
49     cin >> temp;
50
51     while(temp != 0)
52     {
53         vec.push_back(temp);
54         cin >> temp;
55     }
56
57     cout << "input K: " << endl;
58
59     cin >> k;
60
61     int re = findNumberK(vec , k, 0 ,vec.size() - 1);
62
63     cout << "Test Result: "  << re << endl;
64
65     sort(vec.begin(), vec.end(), less<int>());
66
67     cout << "real Result: "  << vec[k-1] << endl;
68     //while(1);
69     return 0;
70 }

 

时间: 2024-07-28 20:21:40

无序整数数组中找第k大的数的相关文章

【算法与数据结构】在n个数中取第k大的数(基础篇)

(转载请注明出处:http://blog.csdn.net/buptgshengod) 题目介绍           在n个数中取第k大的数(基础篇),之所以叫基础篇是因为还有很多更高级的算法,这些以后再讨论.本文用两种最基本的方法来解决这个问题.使用java语言描述.例子是十个数中取第三大的. 算法一              用冒泡法将n个数从大到小排序,再取第k大. public class test { public static void main(String []args) { i

c++-求助:数组中找两个最大的数

问题描述 求助:数组中找两个最大的数 //算法一:依次扫描,分别找出A[x1]和A[x2] void max2_1(int A[], int lo, int hi, int &x1, int &x2) //1 < n = hi - lo { for(int i = lo + 1, x1 = lo; i < hi; i++) //扫描A[lo,hi),找出A[x1] { if(A[x1] < A[i]) x1 = i; //hi-lo-1=n-1 } int x2L = l

C++通过自定义函数找出一个整数数组中第二大数的方法

  本文实例讲述了C++通过自定义函数找出一个整数数组中第二大数的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 const int MINNUMBER = -32767 ; //2字节的Int 0x8000-1, //4字节的Int 0x80000000-1 -2147483647 int find_sec_max( int data[] , int count) { int

【28】一个无序的序列查找第K大的数

题目:给定一个无序序列和一个数k,求这个无序序列中第K大的数 分析: 方案一:最朴素的方法利用快速排序然后找到第k个数,时间复杂度O(nlogn) 方案二:根据快速排序中的partition方法,每次可以把一个序列分成两个部分,左边全部小于等于基准,右边的全部大于等于基准.如果partition方法中基准的位置刚好是第k个则可以直接得多这个数,如果大于k说明在左边,如果小于k说明在右边.               利用这个方法每次可以将序列不断的划分直至找到这第k个数, 因为partition

两个有序数组中查找第K大数

题目:两个数组A.B,长度分别为m.n,即A(m).B(n),分别是递增数组.求第K大的数字.   方法一: 简单的办法,使用Merge Sort,首先将两个数组合并,然后在枚举查找.这个算法的时间复杂度是O(m+n).空间复杂度也是O(M+n). 这个方法其实没有考虑到有第K大数为两个相同数字的情况.   方法二: 这里需要两个前提条件, 1.如果K是中位数,则(M+n)是奇数还是偶数是有关系的.如果是奇数,那么中位数唯一,如果是偶数就有两个中位数,可以随便取一个. 2.如果找到的第K大数是x

c++-数组的指针怎么访问数组中的元素求大神帮忙

问题描述 数组的指针怎么访问数组中的元素求大神帮忙 所有需要的文件均已包含 using arry=int[5]: arry* chen() [ Int j=0,i,a[5]: While(cin>>i) {if(j==5) Break: a[j]=i: ++j: } return &a: ] Int main() {Int (*b)[5]: b=chen(): for(int i=0:i<5:i++) cout<<(*b)[i]<<endl: } 解决方案

对“求数组中所有和为某固定数的所有数对”的算法的简单思考

一.题目描述 有一个数组a[1000],里面存放了1000个整数,请找出该数组中所有和为M的数对.例如数组为- 1,2,4,6,5,3,4,2,9,0,8,3,那么和为8的数对有(-1,9),(2,6),(4,4),(5,3),(5,3),(0,8). 二.最普通的算法 在不可率复杂度的情况下,对于这个问题的最简单的算法如下: private static List<int[]> UseNormalWay(int[] arr, int sumTotal) { List<int[]>

C#递归算法寻找数组中第K大的数_C#教程

1.概述 国人向来喜欢论资排辈的,每个人都想当老大,实在当不成,当个老二,老三,老K也不错,您一定看过这样的争论: 两个人吵架,一个人非常强势,另外一个忍受不住了便说:"你算老几呀?",下面就通过这篇文章就是要解决找出老几的问题! 2.应用场景 在向量V[first,last)中查找出第K大元素的值 3.分析 如果利用排序算法将向量V排好序,那么第K大元素就是索引为v.length-k的元素了,这样能解决问题,但效率不高,因为这相当于为了歼灭敌人一个小队而动用了我们全军的力量,得不偿失

Single Number:从数组中找出只出现一次的数字

[ 问题: ] Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 翻译:给定一个整数数组,数组中所有元素都出现了两次,只有一个元素只出现