寻找第k大数

/*************************************************************************
    > File Name: k_fenshu.cpp
    > Author: wangzhicheng
    > Mail: [email protected]
    > Created Time: Sun 18 Jan 2015 10:47:12 PM WST
	This is a free program, you can modify or redistribute it under the term of GNU
 ************************************************************************/
// search the k_th max number
// for example, 3, 0, 1, 2, the 1 max number is 3, the 2 max number is 2
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
 * @purpose:partition a array, this is generally included in quick sort
 * */
int partition(vector<int>&v, int start, int end) {
	int i, j;
	int k;
	int tmp;
	i = start;
	j = end;
	tmp = v[i];

	while(i < j) {
		while(i < j && v[j] > tmp) j--;
		if(i < j) v[i++] = v[j];
		while(i < j && v[i] < tmp) i++;
		if(i < j) v[j--] = v[i];
	}
	v[i] = tmp;

	return i;
}
void find_k_max(vector<int>&v, int start, int end, int k_th, int &k_max) {
	int pivot;
	int k;
	if(start <= end) {
		pivot = partition(v, start, end);
		k = end - pivot + 1;
		if(k == k_th) k_max = v[k];
		else if(k > k_th) find_k_max(v, pivot + 1, end, k_th, k_max);
		else find_k_max(v, start, pivot - 1, k_th - k, k_max);

	}
}
int main() {
	int n;
	int k_th, k_max;
	int i;
	cout << "number = ";
	cin >> n;
	cout << "k_th = ";
	cin >> k_th;
	if(k_th < 1 || k_th > n) {
		cerr << "imput error...!" << endl;
		exit(1);
	}
	vector<int>v(n);
	for(i = 0;i < n;i++) {
		cout << i << " = ";
		cin >> v[i];
	}
	find_k_max(v, 0, n - 1, k_th, k_max);
	cout << "k_max = " << k_max << endl;

	return 0;
}

时间: 2024-12-17 05:24:42

寻找第k大数的相关文章

SzNOI c016 : 寻找第K大数

这题想的跟题目要求不同导致不断的NA,在题目看来,相同大小的数字的排序也是不一样的,例如100 99 99 99 这四个数字,100是第一,99分别是第二第三第四,我的思路是99三个是重复应该并排第二,只能说坑了点.. 最近刷题都是随机做,随便点开一题做,没按顺序了 原题如下: [问题描述] N个小朋友在一起做游戏. 每个小朋友在自己的硬纸板上写一个数,然后同时举起来. 接着,小y老师提一个问题,看哪个小朋友先抢答出来. 问题是:在这N个数中,第K大的是哪个数?请你编程完成.   [输入格式]

poj 2985 The k-th Largest Group 求第K大数 Treap, Binary Index Tree, Segment Tree

题目链接:点击打开链接 题意:有两种操作,合并集合,查询第K大集合的元素个数.(总操作次数为2*10^5) 解法: 1.Treap 2.树状数组 |-二分找第K大数 |-二进制思想,逼近第K大数 3.线段树 4.... Treap模板(静态数组) #include <math.h> #include <time.h> #include <stdio.h> #include <limits.h> #include <stdlib.h> const

寻找第K大元素的八大算法、源码及拓展

一.问题描述 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题. 第K大问题可以是现实问题,譬如竞价排名中的第K个排名,或者多个出价者中的第K大价格等等. 二.解法归纳 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k). 很好理解,利用快排对所有元素进行排序,然后找到第K个元素即可. 解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数.总的时间复杂度为O(n*k)

BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ----------------------------------------------------------------------------------------- #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> using namespace std;

用快速排序法寻找第k大元素

#include<iostream> #include<algorithm> #include<iterator> #include<cstdio> using namespace std; // 求首元素.中间元素和尾元素的中位数,将中位数与首元素交换位置 inline void medianAsPivot(int arr[], const int& left, const int& right) { const int middle =

HDU 4006 求第k大数 treap

裸题,瞬秒.. #include <stdio.h> #include <iostream> #include <algorithm> #include <math.h> #include <vector> #include <set> #include <map> #include <queue> using namespace std; #define L(id) tree[id].ch[0] #defin

BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Status][Discuss] Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. Input 第一行N,M接下来M行,每行形如1 a

快速查找无序数组中的第K大数?

1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高效算法. 还记得我们快速排序的思想麽?通过“partition”递归划分前后部分.在本问题求解策略中,基于快排的划分函数可以利用“夹击法”,不断从原来的区间[0,n-1]向中间搜索第k大的数,大概搜索方向见下图: 2.参考代码: 1 #include <cstdio> 2 3 #define sw

两个有序数组中查找第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,假如在