生成“近似排序”或“k排序”列表的算法?

时间:2013-11-07 00:31:28

标签: algorithm

我想生成一些测试数据来测试一个函数,该函数将'k sorted'列表(每个元素最多k个位置的列表,远离它的正确排序位置)合并为一个完全排序的列表。我有一种方法可行,但我不确定它的随机性如何,我觉得应该有一种更简单/更优雅的方法来做到这一点。我目前的做法:

  1. 生成与整数索引配对的n个随机元素。
  2. 对随机元素进行排序。
  3. 将每个元素的配对索引设置为其排序位置。
  4. 向后遍历元素,使用元素交换每个元素,该元素在列表中位于其后面1到k个位置之间的随机距离。只有当目标元素的配对索引是当前索引时才与目标元素交换(这样可以避免交换已经不合适的元素并将其移动到远离k应该位置的位置)。
  5. 将受扰动的元素复制到另一个列表中。
  6. 就像我说的,这有效,但我对替代/更好的方法感兴趣。

4 个答案:

答案 0 :(得分:1)

我认为您可以使用随机整数填充数组,然后使用自定义停止条件在其上运行quicksort。

如果在特定的快速排名递归中,startend索引的距离小于k,则只需返回而不是继续重复。

由于quicksort的工作原理,start..end区间中的每个数字都属于该区域的某个位置;最糟糕的情况是,array[start]可能真正属于array[end](反之亦然),真正按排序顺序排列。因此,确保startend之间的距离不超过k就足够了。

答案 1 :(得分:1)

您可以生成随机数组,然后像shellsort一样对其进行h-sort,但是当 h 小于 k 时,没有fiew最后的排序步骤

答案 2 :(得分:0)

步骤1:随机置换长度为k的不相交段。 (例如,1至K,k + 1至2k ......)

步骤2:通过交换有条件地进行置换(它们不会破坏k-排序假设(1 + t yo k + t,k + 1 + t到1 + 2k + t ...),其中t是a数字介于1和k之间(最优选为k / 2)

可能用不同的t重复步骤2多次。

答案 3 :(得分:0)

如果我理解了这个问题,您希望算法随机选择一个k - 已排序的长度为n的列表,从所有U的Universe k中统一选择} - 排序长度为n的列表。 (然后,您将运行此算法m次以生成m列表作为输入测试数据。)

第一步是计算它们。 U的大小是多少? |U|

下一步是枚举它们。在整数F(1,2,...,|U|)之间创建任意一对一映射k - 排序长度为n的列表。

然后随机选择1到x之间的整数|U|,然后应用F(x)来获取列表。