我想对条目列表进行排序,然后选择该排序列表的子集(页面)。例如;我有10,000个物品,想要物品101到200。 一种天真的方法是先对所有10.000项进行排序,然后选择页面;这意味着项目1 - 100和201 - 10.000都被不必要地完全排序。 是否有一个现有的算法只能对页面中的项目进行完全排序,并且一旦明确它不在页面中就停止进一步排序? C中的源代码会很棒,但描述也可以。
答案 0 :(得分:3)
假设您需要n中的项目p到q。虽然排序会花费O(n·log n)时间,但您提到的操作可以在O(n)时间内完成(只要qp«n),如下所示:应用O(n)-time method找到pᵗʰ和qᵗʰ值。然后只选择值为p到q的项目,时间为O(n + k),如果k = qp,或者大约为O(n)时间,则在时间O(k·log k)中对这些项目进行排序,即约为O (1),如果k是O(1),则净时间为O(n)。
答案 1 :(得分:0)
假设您想要的页面以 nth “最小”元素(或您喜欢的最大或任何序数比例)开头。然后,您需要将部分排序算法分为两个步骤:
Quicksort是一种排序算法,可以方便地进行修改以满足您的需求。基本上,它的工作原理如下:
在步骤#1中要执行的操作是运行Quicksort,直到找到 nth 元素。所以步骤#1将如下所示:
此算法返回以 nth 元素开头的未排序元素列表。接下来,在此列表上运行Quicksort,但继续忽略 B ,除非 #A<小号。最后,您应该有一个 s 排序元素的列表,这些元素大于原始列表中的 n 元素但不大于 n + 1 原始列表中的元素。
您要研究的术语是partial sorting。可能会用C或任何足够流行的语言来实现它。