// 最小的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)
{
if(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)
{
if(data.size()== || 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));
}
}
}
while(q.size()>)
{
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)
{
if(a==NULL || len<= || k<=)
return ;
int start = ,end = len-;
int index = Partition(a,start,end);
//取出最小的K个数
while(index != k-)
{
if(index < k-)
{
start = index +;
index = Partition(a,start,end);
}else{
end = index -;
index = Partition(a,start,end);
}
}
for(int i=;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,); int a[]={,,,,,,,};
GetNumber2(a,,); system("pause");
return ;
}

最小的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. 【C#】1.2 控制台应用程序学习要点

    分类:C#.VS2015 创建日期:2016-06-14 教材:十二五国家级规划教材<C#程序设计及应用教程>(第3版) 一.要点概述 <C#程序设计及应用教程>(第3版)的第 ...

  2. sql 随机抽取几条数据的方法 推荐

    传说用这个语句管用:select top 5 * from tablename order by newid() 我放到sql的查询分析器里去执行果然管用,随机抽取5条信息,不停的换,结果我应用到程序 ...

  3. 根据IP地址获取地址所在城市帮助类(IPHelper)

    很多类库都是需要在长时间的编写过程中进行积累的,进入软件编程行业已经是第五个年头了,从2011年写下第一行代码到现在不知道已经写了多少行代码了,时间也过得挺快的.最近事情比较多,也很少写博客了,最近项 ...

  4. FL2440驱动添加(2): RTC(Real time clock)

    一,Linux下的时间分为两种,系统时间与硬件时间(RTC芯片): 1,系统时间就是运行系统能够直接看到的时间: 2,硬件时间就是RTC芯片中的时间,断电任然有电池供电: linux系统开机时,会从R ...

  5. CSS层次选择器温故-2

    1.层次选择器 通过HTML的DOM元素间的层次关系获取元素,层次关系包括后代.父子.相邻兄弟和通用兄弟,通过其中某类关系可以方便快捷地选定需要的元素 2.语法 3.兼容性 IE7以及以上版本 4.后 ...

  6. XStream的例子

    写个小例子,方便以后复习: 1 package com.demo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 impor ...

  7. 迭代器 iterator(二): 用iterator遍历arraylist

           迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些 ...

  8. 安卓开发_浅谈Android动画(三)

    一.LayoutAnimation布局动画 用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果 在res-anim文件下新建一个动画xml文件 <?xml ve ...

  9. C++ RTTI

    一.定义:RTTI:Run Time Type Identification ,运行时类型识别:指程序能够使用基类的指针或引用来检索其所指对象的实际派生类型.二.使用方式:C++中有两个操作符提供RT ...

  10. VIP - virtual IP address

    virtual IP address (虚拟 IP 地址)1.是集群的ip地址,一个vip对应多个机器2.与群集关联的唯一 IP 地址 see wiki: A virtual IP address ( ...