// 最小的k个数.cpp : 定义控制台应用程序的入口点。
 //

 #include "stdafx.h"
 #include <iostream>
 #include <set>
 #include <vector>
 #include <queue>
 using namespace std;

 //  set中默认是从大到小的顺序,即最先取出的是最小值
 //  此处为从小到大,最先取出的是最大值
 typedef multiset<int,greater<int>> inSet;
 typedef multiset<int,greater<int>>::iterator setIterator;

 //  基于红黑树
 void GetNumber(vector<int> &data,inSet &leastNumber,int k)
 {
      || data.size()==)
         return ;
     leastNumber.clear();
     vector<int>::iterator it = data.begin();
     for(;it!=data.end();++it)
     {
         if(leastNumber.size()<k)
             leastNumber.insert(*it);
         else{
             setIterator s = leastNumber.begin();

             if(*it < *s)
             {
                 leastNumber.erase(s);
                 leastNumber.insert(*it);
             }
         }
     }
     setIterator s = least.begin();
     for(;s!=least.end();++s)
         cout<<*s<<" ";
     cout<<endl;
 }

 //  基于优先队列
 void GetNumber2(vector<int> &data,int k)
 {
      || k<)
         return ;
     //  top取出的是最小值,即是按从大到小排列的
     //priority_queue<int,vector<int>,greater<int>> q;
     // 默认是从小到大排列,即最先取出的是最大值
     priority_queue<int> q;
     vector<int>::iterator it = data.begin();
     for(;it!=data.end();++it)
     {
         if(q.size()<k)
             q.push(*it);
         else{
             if(*it < q.top())
             {
                 q.pop();
                 q.push((*it));
             }
         }
     }
     )
     {
         cout<<q.top()<<" ";
         q.pop();
     }
     cout<<endl;
 }

 int Partition(int *a,int start,int end)
 {
     if(start < end)
     {
         int i=start,j=end;
         int x = a[start];
         while(i<j)
         {
             while(i<j && a[j]>x)
                 j--;
             if(i<j)
                 a[i++] = a[j];
             while(i<j && a[i]<x)
                 i++;
             if(i<j)
                 a[j--] = a[i];
         }
         a[i] = x;
         return i;
     }
 }

 //  基于分治思想,但会修改数组,时间复杂度为O(N)
 void GetNumber2(int *a,int len,int k)
 {
      || k<=)
         return ;
     ,end = len-;
     int index = Partition(a,start,end);
         //取出最小的K个数
     )
     {
         )
         {
             start = index +;
             index = Partition(a,start,end);
         }else{
             end = index -;
             index = Partition(a,start,end);
         }
     }
     ;i<k;++i)
         cout<<a[i]<<" ";
     cout<<endl;
 }

 int _tmain(int argc, _TCHAR* argv[])
 {
     vector<int> v;
     v.push_back();
     v.push_back();
     v.push_back();
     v.push_back();
     v.push_back();
     v.push_back();
     v.push_back();
     inSet least;
     GetNumber1(v,least,);

     GetNumber2(v,);

     ,,,,,,,};
     GetNumber2(a,,);

     system("pause");
     ;
 }
     

最小的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个数&amp;python中巧用最大堆

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

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

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

随机推荐

  1. MySQL 常用的UPDATE操作

    标签:UPDATE 概述 测试环境:mysql 5.6.21 步骤 创建测试表 CREATE TABLE `product` ( `proID` ) NOT NULL AUTO_INCREMENT C ...

  2. CSS系列:CSS3新增选择器

    1. CSS1定义的选择器 选择器 类型 说明 E 类型选择器 选择指定类型的元素 E#id ID选择器 选择匹配E的元素,且匹配元素的id为“id”,E选择符可以省略. E.class 类选择器 选 ...

  3. java-集合4

    浏览以下内容前,请点击并阅读 声明 对象排序 一个List对象中如果元素类型为String,则其按字母表顺序排序,而如果元素类型为Date,则按照年代排序,那如何判断元素的排序呢?String和Dat ...

  4. NOI上看到的几个小学奥数

    :余数相同问题 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同 ...

  5. Oracle数据库分页的三种方法

    -- 不能对ROWNUM使用>(大于1的数值).>=(大于或等于1的数值).=(大于或等于1的数值),否则无结果-- 所以直接用只能从1开始-- rownum >10 没有记录,因为 ...

  6. 挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup

    这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,其中ToAr ...

  7. imac上php环境php+apache+mysql

    ---恢复内容开始--- Mac OS X系统已预装集成了Apache+php,但是在新的系统中苹果取消了图形界面,所以只能从命令行开启了. 启用apache: 打开终端 在终端中可以查看集成的php ...

  8. linux下oracle 10g的sqlplus无法使用

    问题如标题所示. 解决办法, 1,root用户登录,建立软连接 cd / cd /usr/bin ln -s /home/oracle/product/10.2.0/db_1/bin/sqlplus ...

  9. Windows Store 开发总结——文件操作

    1.读取Isolated Storage 每个Metro程序都有三个文件夹:Local,Roaming,Temp.每个文件夹的访问方法都是相同的. Local用于将数据存储在本地,这是程序特定的文件夹 ...

  10. MySQL 性能优化的最佳20多条经验分享[转]

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.     当我们去设计数据库表结构, ...