关注
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;
}
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 你觉得实习能学到东西吗 #
30868次浏览 632人参与
# 机械人集合!你是什么工程师? #
15308次浏览 88人参与
# 现代汽车前瞻技术研发急速编程挑战赛 #
25946次浏览 211人参与
# 秋招什么时候开投比较合适? #
19000次浏览 274人参与
# 发工资后,你做的第一件事是什么 #
67554次浏览 229人参与
# 如何准备秋招 #
18058次浏览 348人参与
# 百度工作体验 #
219205次浏览 1957人参与
# 机械人与华为的爱恨情仇 #
116197次浏览 942人参与
# 工作中哪个瞬间让你想离职 #
25434次浏览 177人参与
# 硬件应届生薪资是否普遍偏低? #
73580次浏览 514人参与
# 不考虑转正,实习多久合适 #
31567次浏览 145人参与
# 影石Insta360求职进展汇总 #
123124次浏览 1069人参与
# 通信和硬件还有转码的必要吗 #
57249次浏览 526人参与
# 24届的你们都什么时候入职? #
59956次浏览 424人参与
# 面试被问期望薪资时该如何回答 #
255974次浏览 1479人参与
# 实习,不懂就问 #
41827次浏览 643人参与
# 你们公司几号发工资 #
20524次浏览 139人参与
# 软开人,秋招你打算投哪些公司呢 #
102425次浏览 958人参与
# 每个月的工资都是怎么分配的? #
25036次浏览 408人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
28977次浏览 460人参与
# 你觉得现在还能进互联网吗? #
7456次浏览 130人参与