关注
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;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
123123d:简历还没有你的照片清晰,你到底是来秀照片,还是改简历的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你觉得面试是靠实力还是靠运气 #
26899次浏览 290人参与
# 哪些公司在招寒假实习? #
19593次浏览 256人参与
# MiniMax求职进展汇总 #
919次浏览 23人参与
# 秋招遇到的奇葩面试题 #
103075次浏览 421人参与
# 卷__卷不过你们,只能卷__了 #
13736次浏览 311人参与
# 互联网行业现在还值得去吗 #
49327次浏览 362人参与
# 26年哪些行业会变好/更差 #
21055次浏览 311人参与
# 写论文的崩溃时刻 #
7541次浏览 168人参与
# 秋招暂停,我将对以下公司做出处罚__ #
50162次浏览 200人参与
# 去年的flag与今年的小目标 #
11209次浏览 223人参与
# 通信硬件公司爆料 #
186644次浏览 548人参与
# 你不能接受的企业文化有哪些 #
13902次浏览 193人参与
# 有深度的简历长什么样? #
18047次浏览 368人参与
# 你都用AI做什么 #
7660次浏览 179人参与
# 入职第一天 #
11251次浏览 246人参与
# 关于春招你都做了哪些准备? #
122343次浏览 709人参与
# 国企vs私企,你更想去? #
306283次浏览 2494人参与
# 硬件/芯片公司工作体验 #
141941次浏览 939人参与
# 找工作中的小确幸 #
75636次浏览 439人参与
# 大家实习都在做什么? #
16620次浏览 224人参与
# 招聘要求与实际实习内容不符怎么办 #
149284次浏览 887人参与