寻找第k个最大数

寻找第k个最大数,当然可用来求中值。

采用减治方法,将数组分为两个部分,与寻找值位置比较,类似二分法。重点理解当寻找结果在后半段时候,key值保持不变,《算法设计与分析基础》讲是右边数组的q-key个最大数,对于整个数组来书还是最第key个最大数。

import java.util.Scanner;

public class FindKMax {

	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
//		int n=scanner.nextInt();
//		int a[]=new int [n];
//		for (int i = 0; i < a.length; i++) {
//			a[i]=scanner.nextInt();
//		}
		int n=9;
		int a[]={4,1,10,9,7,12,8,2,15};
//		int n=7;
//		int a[]={4,3,2,1,6,7,5};
		int key=scanner.nextInt();
		if (key<=0||key>n) {
			System.out.println("Wrong input!");
			return;
		}
		findKMax(a, 0, n-1, key-1);
	}

	public static void findKMax(int a[], int p, int e, int key) {
		if (p<=e)
		{
			int q=partion(a, p, e);
			if (key==q){
				System.out.println(a[q]);
			}
			else if (key>q) {
				findKMax(a, q+1, e, key);//very important understand !
			}
			else {
				findKMax(a, p, q-1, key);
			}
		}
	}

	public static int partion(int a[], int p, int e)// the last is the compare Value
	{
		int x=a[e];
		int j=p-1;
		for (int i = p; i < e; i++) {
			if (a[i]<x) {
				j++;
				swap(a, i, j);
			}
		}
		swap(a, e, j+1);
		return j+1;
	}
	public static int partition(int a[], int p, int e)//the first is the compare Value
        {
		int x=a[p];
		int j=e+1;
		for (int i = e; i >p; i--) {
			if (a[i]>x) {
				j--;
				swap(a, i, j);
			}
		}
		swap(a, p, j-1);
		return j-1;
	}

	public static void  swap(int a[], int i, int j) {
		int t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
}

寻找第k个最大数

时间: 2024-10-05 16:22:32

寻找第k个最大数的相关文章

用快速排序法寻找第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 =

在N个数中查找前K个最大数

在N个数中查找前K个最大数,主要利用小堆的特点,小堆,是根节点元素小于左右子树元素,查找前K个最大数,先将N个数中的前K个数生成小堆,接着,依次将N中的剩余的数与小堆的根节点相比,如果大于根节点,则根节点换为这个数,再将堆进行生成小堆,依次直到N中无剩余,代码如下 #define N 10000 #define K 100 void Create(int top[],int parent) { int child = 2 * parent + 1; while (child < K) { if

寻找第K个丑数

把只包含质因子2.3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数. 写一个高效算法,返回第n个丑数. import static java.lang.Math.min; import static java.lang.System.out; public class UglyNumber { public static void main(String[] args) { out.println(findKth

Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)

题目原文 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

寻找第K小的数。

思想,利用快排思想,不断寻找分解点,将分界点的下标与K-1比较如果相等,返回该值,否则更新左右边界.当左右边界中的值少于等于2个时,运用插入排序,返回a[k-1] int findCut(vector<int>& a, int l, int r) { if (l + 1 >= r) { return -1; } int pivot = a[l]; int i = l, j = r; while (true) { do { i++; } while (i<r&&

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

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

leetcode 215. Kth Largest Element in an Array 寻找第k个大的数---------- java

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example,Given [3,2,1,5,6,4] and k = 2, return 5. Note: You may assume k is always valid, 1 ≤ k ≤ array's

hdu5592/BestCoder Round #65 树状数组寻找第K大

ZYB's Premutation Memory Limit: 131072/131072 K (Java/Others) 问题描述 ZYBZYB有一个排列PP,但他只记得PP中每个前缀区间的逆序对数,现在他要求你还原这个排列. (i,j)(i < j)(i,j)(i<j)被称为一对逆序对当且仅当A_i>A_jA?i??>A?j?? 输入描述 第一行一个整数TT表示数据组数. 接下来每组数据: 第一行一个正整数NN,描述排列的长度. 第二行NN个正整数A_iA?i??,描述前缀区间

SzNOI c016 : 寻找第K大数

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