编程之美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 (array[high] > tempItem
&& high > low)
{
high--;
} if (low < high)
{
array[low] = array[high];
low++; while (array[low] <= tempItem
&& low < high)
{
low++;
} array[high] = array[low];
high--;
}
} array[low] = tempItem; if (low == array.Length - k)
{
value = array[low];
return;
}
else if (low < array.Length -k) // 第k个元素在右分支中
{
if (low + < j)
{
SelectShort(array, low + , j, k, out value);
}
}
else // (low > k-1)第k个元素在左分支中
{
if (i < low - )
{
SelectShort(array, i, low - ,k,out value);
}
}
}

方法二:

借助编程之美的思想,求前k个最大的数,其中最小的就是。

  // 创建最大堆
public static void CreateStack(int[] array, int startIndex, int lastIndex)
{
for (int root = lastIndex / ; root >= startIndex; root--)
{
int currentRoot = root;
int leftLeafIndex = * root + ; // 左孩子
int rightLeafIndex = leftLeafIndex +; // 右孩子 while (leftLeafIndex <= lastIndex)
{
if (leftLeafIndex < lastIndex
&& rightLeafIndex <= lastIndex
&& array[leftLeafIndex] < array[rightLeafIndex])// 右孩子存在而且右孩子大于左孩子
{
leftLeafIndex++;
} if (array[leftLeafIndex] > array[root])
{
int temp = array[root];
array[root] = array[leftLeafIndex];
array[leftLeafIndex] = temp; currentRoot = * currentRoot + ; //继续寻找是否到了叶子结点
leftLeafIndex = * currentRoot + ;
}
else
{
break;
}
}
}
} //堆排序
public static void StackSort(int[] arrary)
{
CreateStack(arrary, , arrary.Length - ); int temp; for (int j = arrary.Length - ; j > ; j--)
{
temp = arrary[j];
arrary[j] = arrary[];
arrary[] = temp; CreateStack(arrary, , j - );
}
}

编程之美2.5:寻找最大的K个数的更多相关文章

  1. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...

  2. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  3. LeetCode:Climbing Stairs(编程之美2.9-斐波那契数列)

    题目链接 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either c ...

  4. 24点C++程序实现 编程之美1.16

    解法1,对于任意输入的四个数字,给出一个24点的解法,若无解,则没有输出. 原理参照下图(编程之美原书) 代码如下,仅供参考 // 1.16.cpp : Defines the entry point ...

  5. Python编程之美:最佳实践指南PDF高清完整版免费下载|百度云盘|Python新手到进阶

    百度云盘:Python编程之美:最佳实践指南PDF高清完整版免费下载 提取码:1py6 内容简介 <Python编程之美:最佳实践指南>是Python用户的一本百科式学习指南,由Pytho ...

  6. 寻找最大的k个数问题

    这是编程之美书第2.5节的一道题目. 各种解法: 解法一,用nlgn复杂度的排序算法对数组进行从大到小排序,取前K个.但这方法做了两件不必要做的事:它对想得到的K个数进行了排序,对不想得到的n-K个数 ...

  7. 算法系列:寻找最大的 K 个数

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  8. 算法练习:寻找最小的k个数

    参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中 ...

  9. 第2章 数字之魅——寻找最大的K个数

    寻找最大的K个数 问题描述 在面试中,有下面的问答: 问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有 ...

随机推荐

  1. jQuery制作瀑布流(转)

    “瀑布流布局”随着pinterest网的流行而出名,现在国内使用这种风格布局的网站也越来越多,比如说Mark之,蘑菇街,点点网,哇哦等等.我第一次听到这个布局名称是来自于“乔花写的<瀑布流布局浅 ...

  2. java.io.FileOutputStream类的5个构造方法

    java.io.FileOutputStream的构造函数: ①FileOutputStream(File file) ②FileOutputStream(String name) ③FileOutp ...

  3. Java:数组

    数组 数组是一种引用数据类型(所以才会看到 new int[]),数组的长度初始化完成后是固定的.在内存中初始化数组后的空间就固定下来,即便数组中的内容被清空了,但在内存中占有的空间保留了下来,依然是 ...

  4. JS正则表达式基础

    正则表达式的作用:      测试字符串的某个模式     替换文本     根据模式匹配从字符串中提取一个子字符串.可以用来在文本或输入字段中查找特定文字 [^\d]/g这是一个正则表达式,在JS中 ...

  5. 关于jquery计算页面元素数量

    这段jquery计算页面元素数量代码,能不能刷新页面直接输出数量,而不用点计算按钮 <scriptsrc="http://ajax.googleapis.com/ajax/libs/j ...

  6. c++普通高精加

    //作为一名蒟蒻,还请诸位不要吐槽. //第一次打c++高精加,内心有点小激动. //为codevs3116 高精度练习之加法 //程序太简单,就不打注释了. #include<cstdio&g ...

  7. [vijos P1626] 爱在心中

    做完Victoria的舞会3,挑了vijos里强连通分量里面难度值最低的题目,也就是这道.先把第一小问做了,纯Tarjan,只是我学的时候的标程是用邻接表的,这题数据小于是用了邻接矩阵,两者之间的切换 ...

  8. hadoop 常见问题

    1.Eclipse 读取hdfs文件错误:  java.io.IO Exception : Could not obtain block: blk_194219614024901469_1100 fi ...

  9. [__NSCFString absoluteURL]错误的解决方案

    Xcode提醒错误: -[__NSCFString absoluteURL]: unrecognized selector sent to instance 0x8c4d3a0 *** Termina ...

  10. 第三课 Spinner的使用

    Spinner的表现形式相当于C#的ComboBox,样子如下图: 但选择项的添加方式相当不一样,必须使用数据适配器,上例子. Layout--Main.axml <?xml version=& ...