寻找数组的第k个最大者
来源:互联网 发布:bamboo mac 手绘 编辑:程序博客网 时间:2024/06/04 20:02
使用了两种解法:
- 将全部元素从大到小排序,然后返回第k-1位置的元素
- 选取前k个元素进行排序,然后将剩余的元素插入到对应位置,没插入一次,抛弃最后一个元素,最后返回最后位置的元素
代码如下:
#include <iostream>#include <vector>using namespace std;void bubble_sort(vector<int> &iv);inline void swap(int &a, int &b);void print_vector(vector<int> &v);//sort all elements,and select kthint select_k_max_v1(vector<int> &v, int k);//select k ahead elements as a vector and sort it, and insert remain elements one by oneint select_k_max_v2(vector<int> &v, int k);//return the index of val in sorted v after val inserted itint find_right_position(vector<int> &v, int val);void move_back_one(vector<int> &v, int idx);int main(int argc, char* argv[]){ int a[] = {23, 53, 34, 22, -23, 54}; vector<int> ivec(a, a + sizeof(a) / sizeof(int)); cout << "The vector is:" << endl; print_vector(ivec); cout << endl; bubble_sort(ivec); cout << "After sorted,the vector is:" << endl; print_vector(ivec); cout << endl; int k = 4; cout << "The " << k << "th max num in vector is " << select_k_max_v1(ivec,k)<< endl; cout << "The " << k << "th max num in vector is " << select_k_max_v2(ivec,k)<< endl; return 0;}void bubble_sort(vector<int> &iv){ bool sorted = false; while(!sorted) { sorted = true; for(int i = iv.size(); i > 0; --i) { for(int j = 1; j < i; ++j) { if(iv[j - 1] < iv[j]) { swap(iv[j - 1], iv[j]); sorted = false; } } } }}void swap(int &a, int &b){ int tmp = a; a = b; b = tmp;}void print_vector(vector<int> &v){ for(const int elem : v) cout << elem << " ";}int select_k_max_v1(vector<int> &v, int k){ vector<int> tmp_vec(v); bubble_sort(tmp_vec); return tmp_vec[k - 1];}int select_k_max_v2(vector<int> &v, int k){ vector<int> tmp_vec(k); for(int i = 0; i < k; ++i) tmp_vec[i] = v[i]; for(unsigned int j = k; j < v.size(); ++j) { int idx = find_right_position(tmp_vec, v[j]); if(idx < k) { move_back_one(tmp_vec, idx); tmp_vec[idx] = v[j]; } } return tmp_vec[k - 1];}int find_right_position(vector<int> &v, int val){ int idx = v.size() - 1; for(; idx >= 0; --idx) { if(val <= v[idx]) break; } return idx + 1;}void move_back_one(vector<int> &v, int idx){ for(int i = v.size() - 1; i > idx; --i) v[i] = v[i - 1];}
阅读全文
0 0
- 寻找数组的第k个最大者
- 【算法】寻找K个最大的数组
- 寻找第k个最大数
- 寻找最大的第K个数
- 寻找最大的第K个数
- 寻找数组中最大的K个数
- 找出数组中第K个最大的数
- 求数组中第K个最大的值
- 寻找数组第k大的值
- 寻找k个数组的最小区间
- 寻找数组最大K个数
- 在两个有序数组中寻找第k个元素
- 寻找数组中第k个最小值,使用快速排序
- 总结 -- 寻找最大的K个数,寻找第K大的数
- 用堆排序寻找数组中最大的K个数
- 编程之美2.5 寻找最大的k个树
- 求第K个最大的数
- 寻找两个有序数组的第k小的数
- 十年磨剑服务健康事业
- 动态规划——1087 Super Jumping! Jumping! Jumping!
- windows 安装ninja
- 匈牙利算法
- MyBatis逆向工程的使用
- 寻找数组的第k个最大者
- 20170702
- form表单转json字符串
- servlet
- centos7.2部署tomcat8
- PAT甲级 1029. Median (25)
- hiho一下 第156周 岛屿
- zhihu-spider之Druid——zhihu-spider开源项目使用技术详解(其三)
- 操作系统知识点