最小的k个数
来源:互联网 发布:手机淘宝怎么找到社区 编辑:程序博客网 时间:2024/05/24 03:00
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<=0 || data.size()==0) 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()==0 || k<1) 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()>0) 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<=0 || k<=0) 99 return ;100 int start = 0,end = len-1;101 int index = Partition(a,start,end);102 //取出最小的K个数103 while(index != k-1)104 {105 if(index < k-1)106 {107 start = index +1;108 index = Partition(a,start,end);109 }else{110 end = index -1;111 index = Partition(a,start,end);112 }113 }114 for(int i=0;i<k;++i)115 cout<<a[i]<<" ";116 cout<<endl;117 }118 119 120 int _tmain(int argc, _TCHAR* argv[])121 {122 vector<int> v;123 v.push_back(1);124 v.push_back(3);125 v.push_back(9);126 v.push_back(2);127 v.push_back(3);128 v.push_back(8);129 v.push_back(6);130 inSet least;131 GetNumber1(v,least,5);132 133 GetNumber2(v,5);134 135 int a[]={3,1,35,65,7,3,8,2};136 GetNumber2(a,8,1);137 138 system("pause");139 return 0;140 }141
0 0
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的K个数
- 最小的k个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- Same Tree
- 当你在浏览器地址栏输入一个URL后回车,将会发生的事情
- C++ enum
- ApplicationContext
- 快速排序
- 最小的k个数
- Python核心编程第二版学习笔记
- C++ sort函数
- Android笔记:20150406
- C++ inline
- (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
- C++ 基本知识
- POJ3335Rotating Scoreboard【半平面交判断多边形是否存在内核】
- HTTP详解1-工作原理