1. // 最小的k个数.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <set>
  7. #include <vector>
  8. #include <queue>
  9. using namespace std;
  10.  
  11. // set中默认是从大到小的顺序,即最先取出的是最小值
  12. // 此处为从小到大,最先取出的是最大值
  13. typedef multiset<int,greater<int>> inSet;
  14. typedef multiset<int,greater<int>>::iterator setIterator;
  15.  
  16. // 基于红黑树
  17. void GetNumber(vector<int> &data,inSet &leastNumber,int k)
  18. {
  19. if(k<= || data.size()==)
  20. return ;
  21. leastNumber.clear();
  22. vector<int>::iterator it = data.begin();
  23. for(;it!=data.end();++it)
  24. {
  25. if(leastNumber.size()<k)
  26. leastNumber.insert(*it);
  27. else{
  28. setIterator s = leastNumber.begin();
  29.  
  30. if(*it < *s)
  31. {
  32. leastNumber.erase(s);
  33. leastNumber.insert(*it);
  34. }
  35. }
  36. }
  37. setIterator s = least.begin();
  38. for(;s!=least.end();++s)
  39. cout<<*s<<" ";
  40. cout<<endl;
  41. }
  42.  
  43. // 基于优先队列
  44. void GetNumber2(vector<int> &data,int k)
  45. {
  46. if(data.size()== || k<)
  47. return ;
  48. // top取出的是最小值,即是按从大到小排列的
  49. //priority_queue<int,vector<int>,greater<int>> q;
  50. // 默认是从小到大排列,即最先取出的是最大值
  51. priority_queue<int> q;
  52. vector<int>::iterator it = data.begin();
  53. for(;it!=data.end();++it)
  54. {
  55. if(q.size()<k)
  56. q.push(*it);
  57. else{
  58. if(*it < q.top())
  59. {
  60. q.pop();
  61. q.push((*it));
  62. }
  63. }
  64. }
  65. while(q.size()>)
  66. {
  67. cout<<q.top()<<" ";
  68. q.pop();
  69. }
  70. cout<<endl;
  71. }
  72.  
  73. int Partition(int *a,int start,int end)
  74. {
  75. if(start < end)
  76. {
  77. int i=start,j=end;
  78. int x = a[start];
  79. while(i<j)
  80. {
  81. while(i<j && a[j]>x)
  82. j--;
  83. if(i<j)
  84. a[i++] = a[j];
  85. while(i<j && a[i]<x)
  86. i++;
  87. if(i<j)
  88. a[j--] = a[i];
  89. }
  90. a[i] = x;
  91. return i;
  92. }
  93. }
  94.  
  95. // 基于分治思想,但会修改数组,时间复杂度为O(N)
  96. void GetNumber2(int *a,int len,int k)
  97. {
  98. if(a==NULL || len<= || k<=)
  99. return ;
  100. int start = ,end = len-;
  101. int index = Partition(a,start,end);
  102. //取出最小的K个数
  103. while(index != k-)
  104. {
  105. if(index < k-)
  106. {
  107. start = index +;
  108. index = Partition(a,start,end);
  109. }else{
  110. end = index -;
  111. index = Partition(a,start,end);
  112. }
  113. }
  114. for(int i=;i<k;++i)
  115. cout<<a[i]<<" ";
  116. cout<<endl;
  117. }
  118.  
  119. int _tmain(int argc, _TCHAR* argv[])
  120. {
  121. vector<int> v;
  122. v.push_back();
  123. v.push_back();
  124. v.push_back();
  125. v.push_back();
  126. v.push_back();
  127. v.push_back();
  128. v.push_back();
  129. inSet least;
  130. GetNumber1(v,least,);
  131.  
  132. GetNumber2(v,);
  133.  
  134. int a[]={,,,,,,,};
  135. GetNumber2(a,,);
  136.  
  137. system("pause");
  138. return ;
  139. }

最小的k个数的更多相关文章

  1. 剑指Offer面试题:27.最小的k个数

    一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...

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

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

  3. 剑指Offer:面试题30——最小的k个数(java实现)

    问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...

  4. 输入一个数组,求最小的K个数

    被这道题困了好久,看了剑指Offer才知道OJ上的要求有点迷惑性. 题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 一 ...

  5. 1046: 最小的K个数

    1046: 最小的K个数 时间限制: 1 Sec  内存限制: 128 MB提交: 233  解决: 200[提交][状态][讨论版] 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1 ...

  6. 最小的K个数:用快排的思想去解相关问题

    实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边. 这个函数可以如下实现: int Partit ...

  7. 剑指offer面试题30:最小的k个数

    一.题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.解题思路 1.思路1 首先对数组进行排序,然后取出前k个数 ...

  8. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  9. 求一个数组中最小的K个数

    方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...

随机推荐

  1. sencha panel的头header上添加刷新按钮

    var plet3=Ext.create('portaltest3.view.Portlet',                   { title: '提醒',                   ...

  2. LINQ TO XML 个人的一些心得1

    最近没事做,刚来到一个新公司.写了一些处理xml的项目  就是把一些xml的数据处理后存储到数据库中.原本还是准备用原来的xml来写的.在群里有个人说,用linq to xml 好了,比较快捷.就看了 ...

  3. SqlServer根据时段统计数据

    create table ST_PPTN_R_Real ( TID int primary key identity(1,1), STCD varchar(100) not null, TM date ...

  4. 从几篇文字得到关于web app开发的性能问题的答案

    1. http://blogs.adobe.com/creativecloud/are-mobile-web-apps-slow/ 2. http://software.intel.com/zh-cn ...

  5. 配置了<mvc:resources> 导致以前的controller 无法访问。

    解决方案: <mvc:annotation-driven/>

  6. 媒体对象 - Media Objects(摘录)

    原文链接:http://www.jianshu.com/p/6443be21efbd 一个媒体对象由以下及部分组成 父容器 .media 媒体部分 .media-left 或者 .media-righ ...

  7. Incorrect string value: '\xF0\x90\x8D\x83...' for column 通用解决方案

    mysql插入非ascii字符时报这个错的根本原因在于: 对应表的字符集无法存储要插入的字符,比如汉字插入latin1编码,某些特殊字符插入gbk或者utf8等. 检查一下实际插入的字符以及对应表或者 ...

  8. 用SQL语句操作数据

    转载请注明出处:http://www.cnblogs.com/smbk/ 1.点击[新建查询]按钮,打开SQL命令编辑框,对数据库表的操作以及维护都可以通过编辑SQL命令实现. 2.在编辑框内编辑创建 ...

  9. Xml序列化、反序列化帮助类

    之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...

  10. REUSE_ALV_POPUP_TO_SELECT的使用技巧

    通过函数的方法弹出一个对话框,提供选择数据的功能…… DATA: BEGIN OF lt_exidv OCCURS , box TYPE char1, exidv TYPE exidv, status ...