给定一组数,要求从中找出第k小的元素
2016-04-19 11:49
253 查看
分析:
这里通过快速排序算法来解决次问题。记一趟快速排序后,左子集中的元素个数为nleft,则选择问题,可能是一下几种情况之一:
1) nleft等于k-1,则枢纽值即为所求;
2) nleft大于k-1,则继续在左子树中找;
3) nleft小于k-1,则继续在右子集中找
下面是C++代码实现:
实验结果:
这里通过快速排序算法来解决次问题。记一趟快速排序后,左子集中的元素个数为nleft,则选择问题,可能是一下几种情况之一:
1) nleft等于k-1,则枢纽值即为所求;
2) nleft大于k-1,则继续在左子树中找;
3) nleft小于k-1,则继续在右子集中找
下面是C++代码实现:
#include <iostream> #include <vector> using namespace std; //在下标[lhs,rhs]的容器v中,寻找第k小的数 int func_select_k(vector<int> v, int lhs, int rhs, size_t k) { cout<<"即在"; for (size_t sz = lhs;sz <= rhs;++sz) { cout<<v[sz]<<' '; } cout<<"中寻找第"<<k<<"个数"<<endl; if (lhs >= rhs) return v[lhs]; int pivot = v[lhs]; int i = lhs; int j = rhs; while(i<j) { while (j > i && v[j] >= pivot) { --j; } v[i] = v[j]; while (j>i && v[i] <= pivot) { ++i; } v[j] = v[i]; } v[i] = pivot; //对应分析中第一种情况 if (i - lhs +1 == k) { return v[i]; } //对应分析中的第二种情况 else if (i - lhs +1 > k) { return func_select_k(v,lhs,i-1,k); } //对应分析中的第三种情况 else { return func_select_k(v,i+1,rhs,k-i+lhs-1); } } //在v中寻找第k小的数 int select_k(vector<int> v, size_t k) { size_t sz = v.size(); if (k >= sz || k < 1) { cout<<"输入有误"<<endl; exit(1); } return func_select_k(v,0,sz-1,k); } int main() { vector<int> v; v.push_back(2); v.push_back(1); v.push_back(3); v.push_back(9); v.push_back(1); v.push_back(-3); v.push_back(5); v.push_back(-1); cout<<select_k(v,6)<<endl; return 0; } //2 1 3 9 1 -3 5 -1
实验结果:
相关文章推荐
- Flask 多文件基本结构
- 使用Asp.Net MVC开发兼职文章系统
- Altium Designer
- Java中<T>泛型意思
- iOS开发——界面跳转方法总结
- 使用cxf编写webservice遇到问题
- 移动屏幕旋转解决方法
- 调试web service的问题:“无法自动进入并单步执行服务器。无法确定停止位置。请验证是否已加载符号。未找到符号:……”
- 汇编基本模版
- 基于 Facebook Redex 实现 Android APK 的压缩和优化
- Angularjs练手篇——Server编写
- Linux 更改目录及子目录权限
- 禅与 Objective-C 编程艺术
- @PathVariable
- 前后端数据对接防止接口被恶意调用
- 8-06. 畅通project之局部最小花费问题(35)(最小生成树_Prim)(ZJU_PAT)
- FileUtil.java
- View6.2安全服务器测试环境注意事项
- [django]入门教程3:模板语法及使用
- Eclipse:An internal error occurred during: "Build Project". GC overhead limit exceeded