我正在尝试创建一种排序数字列表的排序技术。但它的作用是比较两个数字,第一个是列表中的第一个数字,另一个数字是2 k -1的索引。
2^k - 1 = [1,3,7, 15, 31, 63...]
例如,如果我有一个列表[1, 4, 3, 6, 2, 10, 8, 19]
这个列表的长度是8.所以程序应该在2 k - 1列表中找到一个小于8的数字,在这种情况下它将是7.
所以现在它将随机列表(1)中的第一个数字与同一个列表中的第7个数字进行比较(19)。如果它大于第二个数字,它将交换头寸。
在此步骤之后,它将继续到4之后的第7个数字,但这不存在,所以现在它应该与4之后的第3个数字进行比较,因为3是2 k中的下一个数字 - 1。
所以它应该将4与2进行比较并交换它们是否在正确的位置。所以这应该继续下去,直到我达到1 in 2 k - 1,其中列表最终将被排序。
我需要帮助开始使用此代码。
到目前为止,我已经写了一个小代码,使得2 k - 1列表,但就我而言。
a = []
for i in range(10):
a.append(2**(i+1) -1)
print(a)
实施例
考虑对序列V = 17,4,8,2,11,5,14,9,18,12,7,1进行排序。跳过
序列1,3,7,15,......得到r = 7作为拟合的最大值,所以看V,第一个稀疏子序列=
17,9,所以当我们通过V时,我们在第一次交换后产生9,4,8,2,11,5,14,17,18,12,7,1,并且
完全使用r = 7后的9,4,8,2,1,5,14,17,18,12,7,11。使用a = 3(跳过的下一个较小的术语
序列),第一个稀疏子序列= 9,2,14,12,当应用于V时给出2,4,8,9,1,5,12,17,18,14,7,11,其余{ {1}}排序给出2,1,8,9,4,5,12,7,18,14,17,11,然后是2,1,5,9,4,8,12,7,11, 14,17,18。最后,使用a = 3
,得到1,2,4,5,7,8,9,11,12,14,17,18。
你可能想知道,鉴于最后我们做了一个没有跳过的排序,为什么 这可能比简单地将最后一步作为开始时的唯一步骤更快。把它想象成梳子 通过序列 - 请注意,在前面的步骤中,我们使用课程梳子来获取远程的东西 正确的顺序,使用逐步更精细的梳子,直到最后我们的微调处理几乎排序的序列 需要很少的调整。
a = 1
这样找到它应该与列表中的第一个数字进行比较的距离,但是现在我需要写一些一直保持这样做直到距离超出范围所以它从3切换到1然后只检查较小的距离直到列表排序。
答案 0 :(得分:4)
您实际描述的排序算法称为 Combsort 。事实上,更简单的bubblesort是combsort的一个特例,其中间隙总是1并且不会改变。
由于你坚持如何开始这个,这就是我的建议: