排序技术Python

时间:2013-07-27 00:45:26

标签: python algorithm sorting

我正在尝试创建一种排序数字列表的排序技术。但它的作用是比较两个数字,第一个是列表中的第一个数字,另一个数字是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然后只检查较小的距离直到列表排序。

1 个答案:

答案 0 :(得分:4)

您实际描述的排序算法称为 Combsort 。事实上,更简单的bubblesort是combsort的一个特例,其中间隙总是1并且不会改变。

由于你坚持如何开始这个,这就是我的建议:

  1. 首先实施bubblesort算法。逻辑更简单,并且在编写时更容易推理。
  2. 一旦你完成了这个,你就拥有了重要的算法结构,从那里只需要将间隙长度计算添加到混合中。这意味着,使用您的特定公式计算间隙长度。然后,您将修改循环控制索引和内部比较索引以使用计算的间隙长度。
  3. 在循环的每次迭代之后,你会减少间隙长度(实际上使梳子更短)一些缩放量。
  4. 最后一步是尝试不同的间隙长度和公式,以了解它如何影响算法效率。