关注
STL里面的nth_element和partial_sort均可以高效解决此问题,最高效的是nth_element,基本思想是快速排序。具体可以参考本人博客:http://blog.csdn.net/bxw1992/article/details/76695461 void nth_element(vector<int> &vec, int num) 将最小(或最大)的num个数放在数组的开始处。注意num个数是无序的。
主要是利用快速排序的切分操作,源码针对枢轴的选取了优化措施(取待处理区间首、中间、尾3个值中的中间值作为枢轴,防止切分操作退化),这里为了简化,没有对枢轴的选取进行优化。
根据切分函数的返回值,判断是否达到了找出了num个满足要求的数,如果不满足,判断下一处理区间。
#include<iostream>
#include<vector>
using namespace std;
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int partition(vector<int> &vec,int low,int hi)
{
int mid = (hi - low) / 2 + low;
int pivot = vec[low];
int i = low + 1;
int j = hi;
while (true)
{
while (i < hi && vec[i] < pivot) i++;
while (j>low && vec[j]>pivot) j--;
if (i >= j) break;
swap(vec[i], vec[j]);
i++;
j--;
}
swap(vec[low],vec[j]);
return j;
}
void nth_element(vector<int> &vec, int num)
{
int len = vec.size();
int low = 0;
int hi = len - 1;
while (low<hi)
{
int j = partition(vec,low,hi);
if (j == num - 1) return;
else if (j < num - 1) low = j+1;
else hi = j - 1;
}
}
void myprint(const vector<int> a)
{
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> data = { 11,5, 4, 7, 6, 8, 1,10 };
myprint(data);
nth_element(data,2);
myprint(data);
system("pause");
return 0;
}
查看原帖
点赞 评论
相关推荐
2025-12-09 23:27
商丘学院 嵌入式软件工程师
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 对2025年忏悔 #
3345次浏览 91人参与
# 新年的第一句祝福 #
50805次浏览 374人参与
# 实习没人带,苟住还是跑路? #
10485次浏览 240人参与
# 运营来爆料 #
72444次浏览 454人参与
# 元旦假期你打算怎么过 #
6841次浏览 161人参与
# 腾讯音乐求职进展汇总 #
145582次浏览 1039人参与
# 春招前还要继续实习吗? #
3281次浏览 55人参与
# 面试官问过你最刁钻的问题是什么? #
7936次浏览 91人参与
# 领导秒批的请假话术 #
30378次浏览 120人参与
# 一人说一家双休的公司 #
6059次浏览 89人参与
# 大家实习都在做什么? #
7864次浏览 85人参与
# 我们是不是被“优绩主义”绑架了? #
8398次浏览 279人参与
# 阿里求职进展汇总 #
444054次浏览 3922人参与
# 电网笔面经互助 #
56883次浏览 470人参与
# 如何提高实习转正率? #
73072次浏览 463人参与
# 腾讯工作体验 #
548287次浏览 3659人参与
# 实习教会我的事 #
47652次浏览 356人参与
# 面试常问题系列 #
262178次浏览 4672人参与
# 牛客2025仙途报告 #
35197次浏览 472人参与
# 国企还是互联网,你怎么选? #
191054次浏览 1476人参与