分页排序算法

时间:2013-07-24 20:50:50

标签: c algorithm sorting pagination

我想对条目列表进行排序,然后选择该排序列表的子集(页面)。例如;我有10,000个物品,想要物品101到200。 一种天真的方法是先对所有10.000项进行排序,然后选择页面;这意味着项目1 - 100和201 - 10.000都被不必要地完全排序。 是否有一个现有的算法只能对页面中的项目进行完全排序,并且一旦明确它不在页面中就停止进一步排序? C中的源代码会很棒,但描述也可以。

2 个答案:

答案 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 “最小”元素(或您喜欢的最大或任何序数比例)开头。然后,您需要将部分排序算法分为两个步骤:

  1. 找到 nth 元素
  2. 排序元素{ n n +1,..., n + s }(其中 s 是页面大小)
  3. Quicksort是一种排序算法,可以方便地进行修改以满足您的需求。基本上,它的工作原理如下:

    • 给定:列出​​ L 的通常相关元素。
    • 如果 L 只包含一个元素,请返回 L
    • 随机选择 L 中的枢轴元素 p
    • L 分为两组: A B ,以便 A 包含来自 L 小于 p B 包含 L 中所有较大的元素。
    • 递归地将算法应用于 A B 以获取已排序的子列表 A' B'
    • 返回列表 A || p || B ,其中||表示附加列表或元素。

    在步骤#1中要执行的操作是运行Quicksort,直到找到 nth 元素。所以步骤#1将如下所示:

    • 给定:列表 L 通常相关的元素,页面偏移 n 和页面大小 s
    • 随机选择 L 中的枢轴元素 p
    • L 分为 A B
    • 如果 A #A = n-1 的大小,则返回 p ||乙
    • 如果 #A < n-1 ,然后递归地应用算法 L'= B n'= n - #A
    • 如果 #A > n-1 ,然后递归地应用算法 L'= A n'= n

    此算法返回以 nth 元素开头的未排序元素列表。接下来,在此列表上运行Quicksort,但继续忽略 B ,除非 #A<小号。最后,您应该有一个 s 排序元素的列表,这些元素大于原始列表中的 n 元素但不大于 n + 1 原始列表中的元素。

    您要研究的术语是partial sorting。可能会用C或任何足够流行的语言来实现它。