您无需对数字列表进行排序即可找到第m 个最小数字.第m 个最小的数字可以在线性时间内找到.即如果n你的数组中有元素,你可以O(n)通过使用选择算法和中值算法的中位数及时得到解决方案.
链接是维基百科的文章,
编辑 2:正如 Eitan 指出的那样,答案的第一部分并没有解决找到最小第 m 个值的问题,而是考虑最小值之后的第 m 个元素。剩下的答案仍然是……为 Eitan 的敏锐度+1。
虽然sort一开始可能非常有效,但您可以尝试看看 a 是否find会更好。例如:
id=find(X>min(X),m,'first');
id(end) % is the index of the smallest m-th element in X
Run Code Online (Sandbox Code Playgroud)
该函数find添加了功能,可让您查找满足某些条件的“第一个”或“最后一个”元素。例如,如果您想查找n数组中X小于某个值的第一个元素y,请使用 find(X<y,n,'first')
一旦遇到满足条件的第一个元素,此操作就会停止,如果数组很大并且您找到的值恰好远离末尾,则可以节省大量时间。
我还想回顾一下 @woodchips 在这个 SO 讨论中已经说过的话,这与你的问题有些相关:
加速基本内置算法(例如排序)的最佳方法是获得更快的硬件。它也会加快其他一切的速度。MATLAB 已经在内部使用优化的代码,以高效的方式做到了这一点。话虽如此,也许 GPU 插件也可以改善这一点......
编辑:
对于它的价值,添加到 Muster 的评论中,有一个名为nth_element的 FEX 文件,它是 C++ 的 MEX 包装,它将及时获得O(n)您需要的解决方案。(类似于@DDD指出的)