这是排序算法的一种非常常见的模式:
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
这些算法,因为指数运行良好i
,并j
都经过精心挑选,根据该列表的状态l
。
但是,如果我们看不到l
,而不得不盲目选择,该怎么办?那我们可以多快排序列表呢?
您面临的挑战是编写一个仅给出给定长度的输出随机索引对的函数l
。具体来说,您必须输出i, j
带有的两个索引,0 <= i < j < len(l)
。您的函数可以在列表的任何长度上工作,但是会在长度为100的列表上得分。
您的分数是根据上述模式对均匀随机混排的列表进行排序所需的平均索引选择数,其中索引是根据您的功能选择的。
我将对提交的内容进行评分,在均匀随机排列的长度为100且没有重复输入的列表上,取1000次试验中的平均索引选择次数。
如果提交的作品明显不具有竞争力或没有终止,我保留进行更少试验的权利,并且我将进行更多试验以区分顶级竞争对手以找到一个获胜者。如果在我的计算资源极限内,多个顶级提交仍在误差范围内,我将宣布较早的提交为获胜者,直到可以利用更多的计算资源为止。
这是一个使用Python的评分程序示例:
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
您的函数可能不会保持任何可变状态,无法与全局变量交互,影响列表l
等。您函数的唯一输入必须是list的长度l
,并且必须输出该范围内的有序整数对[0, len(l)-1]
(或适用于您语言的整数)。列表索引)。随意询问评论中是否允许某些内容。
提交内容可以使用任何免费使用的语言。如果尚未发布使用您的语言的评分工具,请添加评分工具。您可以发布一个临时分数,但我会发表官方分数的评论。
计分是在长度为100的均匀随机混排的列表上排序列表的平均步骤数。祝您好运。