编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array, int low, int high, int k, out int value) { int i = low; int j = high; int tempItem = array[low]; value = int.MinValue; while (low < high) { while (a…
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -----------------------------------------------------------------------------------------   转载自http://www.cnblogs.com/luxiaoxun/archive/2012/08/06/26247…
参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 总体思路: 取n个数字的前k个数字构建大根堆,设根顶元素为kmax, 从n-k+1开始遍历剩余的n-k个元素,取出每一个元素和大根堆根元素进行比较,如果kmax>遍历到的元素值,则kmax=遍历到的元素…
寻找最大的K个数 问题描述 在面试中,有下面的问答: 问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有更多的元素呢? 答:那可以改为:int array[1000] …… 问:如果我们有很多元素,例如1亿个浮点数,怎么办? 答:个,十,百,千,万……那可以写:float array [100 000 000] …… 问:这样的程序能编译运行么? 答:嗯……我从来没写过这么多的0 …… 分析与解法 […
(转:http://www.cnblogs.com/luxiaoxun/archive/2012/08/06/2624799.html) 寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那个,也就是第K大的数. 可以使用二分搜索的策略来寻找N个数中的第K大的数.对于一个给定的数p,可以在O(N)的时间复杂度内找出所有不小于p的数. 寻找第k大的元素: #include <iostream> using namespace std; //快速排序的划分函数 int partition…
题目描述:查找最小的k个元素         题目:输入n个整数,输出其中最小的k个.         例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单直白的思路是,要求一个序列中最小的k个数,按照惯有的思维方式,很简单,先对这个序列从小到大排序,然后输出前面的最小的k个数即可. 至于选取什么的排序方法,可能会第一时间想到快速排序,我们知道,快速排序平均所费时间为n*logn,然后再遍历序列中前k个元素输出,即可,总的时间复杂度为O(n*logn+…
有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2个多小时,反思,太慢了. 注意边界条件,不要混混沌沌的. /************我自己的解法*****************/ //选择数组a[N]中最大的第k个数 int Select(int * a, int N, int k) { if(k > N || a == NULL) { cou…
这是编程之美书第2.5节的一道题目. 各种解法: 解法一,用nlgn复杂度的排序算法对数组进行从大到小排序,取前K个.但这方法做了两件不必要做的事:它对想得到的K个数进行了排序,对不想得到的n-K个数也进行了排序.方法不可取. 解法二,用选择排序或冒泡排序,复杂度O(NK).但这方法也做了不必要做的一件事:对想得到的K个数进行了排序.方法不可取. 解法三,用顺序统计位(类快排)算法来计算(可参考算法导论).算法导论上说这种方法从平均性能上来讲是线性的,但编程之美上却说复杂度是O(N*lgK).对…
这个题目是非常经典的一个题目,解法也有很多,现在就把我已经理解的解法记录下来. 题目描述 有n个无序的数,它们各不相等,怎样选出其中的最大的k个数呢? 题目分析: 解法1: 最容易想到的就是把n个数进行排序,然后选择最大的k个数.排序算法很多,快速排序和堆排序都是不错的选择,他们的复杂度都是Ο(n*log2n),然后取出前k个Ο(k),总的时间复杂度可以看成是Ο(n*log2n) 在这个解法中,对n个数进行了排序,如果n的数值非常大的话,会很慢. 解法2: 能不能只遍历一边n个数就能把最大的k个…
目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. 具体代码如下: package com.liuzhen.array_2; public class SearchMinK { //方法1:全部排序 public void quickSort(int[] A,int s…