我必须使用元素之间的最小比较数来建模在python中对5个元素的列表进行排序的执行计划。除此之外,复杂性无关紧要。
结果是一个对列表,表示在另一个时间对列表进行排序所需的比较。
我知道有一种算法在7次比较中完成此操作(元素之间,总是,不是复杂性),但我找不到可读的(对我来说)版本。
如何对7个比较中的5个元素进行排序,并为排序构建“执行计划”?
PD:不作业。
答案 0 :(得分:3)
嗯,有5种!= 120种方式如何订购元素。每次比较都会给你一些信息,所以你需要至少k次比较,其中2 ^ k> = 120.你可以检查2 ^ 7 = 128,所以7是你需要执行的比较次数最少。
答案 1 :(得分:2)
这符合您对排序5 elements in 7 comparisons
:
import random
n=5
ran=[int(n*random.random()) for i in xrange(n)]
print ran
def selection_sort(li):
l=li[:]
sl=[]
i=1
while len(l):
lowest=l[0]
for x in l:
if x<lowest:
lowest=x
sl.append(lowest)
l.remove(lowest)
print i
i+=1
return sl
print selection_sort(ran)
这使用的Selection Sort不是最有效的,但使用的比较很少。
这可以缩短为:
def ss(li):
l=li[:]
sl=[]
while len(l):
sl.append(l.pop(l.index(min(l))))
return sl
在任何一种情况下,都会打印出类似这样的内容:
[0, 2, 1, 1, 4]
1
2
3
4
5
[0, 1, 1, 2, 4]
Perl有一个名为Algorithm::Networksort的可爱模块,可让您玩这些模块。 Knuth引用了Bose-Nelson算法的几个比较器,你可以看到它here。
修改强>
insertion sort也很有效:
def InsertionSort(l):
""" sorts l in place using an insertion sort """
for j in range(1, len(l)):
key = l[j]
i = j - 1
while (i >=0) and (l[i] > key):
l[i+1] = l[i]
i = i - 1
l[i+1] = key
答案 2 :(得分:0)
我最终使用常规排序算法(插入排序)和自定义比较运算符,该运算符中断排序并逐步构建执行计划以恢复或重现该过程。
很丑:该函数引发了一个异常,封装了继续排序所需的信息。然后可以使用新信息重试排序,可能会再次中止。
由于在http请求范围内进行排序尝试,性能对我来说不是问题。