我试图找到一种最有效的方法来排序长度为n的未排序数组的t个最小整数。
我正在尝试运行O(n)但是一直卡住了。
我能想到的最好的方法就是整理整个阵列并取得第一个t。在所有其他情况下,我一直有机会留下最小的遗留物,如果我再检查它们,那么整个阵列的排序时间也相同。
有人能给我一些想法吗?
答案 0 :(得分:3)
运行类似quickselect的内容以查找第t个元素,然后对数据进行分区以提取t个最小元素。这可以在O(n)时间内完成(平均情况)。
快速选择是:
类似于快速排序的算法,它重复选择“枢轴”并根据此枢轴对数据进行分区(将枢轴留在中间,左侧是较小的元素,右侧是较大的元素)。然后它递归到包含目标元素的一侧(通过计算任一侧的元素数量可以很容易地确定它。)
然后你仍然需要对t元素进行排序,这可以通过例如quicksort或mergesort来完成,给出O(t log t)的运行时间。
总的运行时间是O(n + t log t) - 你可能做得不够好。
答案 1 :(得分:0)
如果t
远小于n
,您可以在数组中的一个遍历中找到这些t
元素,始终保存t
个最小的项目并删除更大的项目整数 - 许多数据结构可用于此,例如BST。
然后运行时间为min(O(n), O(t log(t)))