这里是我的解决方案的一些不完整的代码。它只需要传递一个向量。这将以vec的线性时间运行。希望它清除一切。我以前的文章有点罗嗦。尽管如此,我仍然把它放在这个源码下面
int iterative_kth_element(vector<int>& vec, size_t k)
{
int mins[k];
//assume first k elements are min
for(int i=0; i<k; i++)
{
mins[i] = vec[i];
}
//TODO:
//sort mins array here
//bubble sort is okay if k is small, or pivot
for(int i=k; i < vec.size(); i++)
{
//since mins is sorted, mins[k-1] is the highest value
if(vec[i] < mins[k-1])
{
mins[k-1] = vec[i];
}
//TODO:
//sort mins array here
//you could do a slick bubble sort starting from
//the back of mins until you find the location
//for the new min item
}
return mins[k-1];
}
//在前文
如果你正在寻找第k最小的项目。你应该用第一个k项来初始化一个数组。或者将索引存储到找到最小项目的vec中(将从0,1,2,3开始,...,K)
int index = 0;
int min = vec[0];
应该
int* mins = new int[k];
for(int i=0; i < k; i++) {
mins[i] = vec[i];
}
我也建议保持此数组排序ķ最小的整数。如果您知道最大物品的位置,您只需检查vec中的每个元素与最大物品的分钟数。不过,您需要一种排序方法,每次找到比分钟小的东西时就会调用它。
经过一次vec迭代后,您应该在该数组中有最小的k个项目。只需返回最大的项目。存储在阵列中的位置0或k-1处。
还有其他值得注意的地方:如果k大于vec.size()/ 2,你应该寻找(vec.size()-k)最大的项目。
这应该是log(k * n)时间,最大内存占用为1.5n(k是vec.size()/ 2是最差情况)。
其中n是vec的大小,k是函数中的parm(如果实现该注释,则k的上限为n/2)。
最糟糕的情况是获取数字的降序顺序列表,其中k是n的一半大小。
的,除非你真的需要* *不这样做(例如,这是家庭作业)使用'的std :: nth_element'。 –
实际上排序向量并从前面返回第k个元素可能是一个更快的方法,除非你真的想要迭代求解 – smac89
是的,我必须用未排序的向量来执行 –