我想生成一些测试数据来测试一个函数,该函数将'k sorted'列表(每个元素最多k个位置的列表,远离它的正确排序位置)合并为一个完全排序的列表。我有一种方法可行,但我不确定它的随机性如何,我觉得应该有一种更简单/更优雅的方法来做到这一点。我目前的做法:
就像我说的,这有效,但我对替代/更好的方法感兴趣。
答案 0 :(得分:1)
我认为您可以使用随机整数填充数组,然后使用自定义停止条件在其上运行quicksort。
如果在特定的快速排名递归中,start
和end
索引的距离小于k
,则只需返回而不是继续重复。
由于quicksort的工作原理,start..end
区间中的每个数字都属于该区域的某个位置;最糟糕的情况是,array[start]
可能真正属于array[end]
(反之亦然),真正按排序顺序排列。因此,确保start
和end
之间的距离不超过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)
来获取列表。