Python排序技术



我正在尝试创建一种对数字列表进行排序的排序技术。但它所做的是比较两个数字,第一个是列表中的第一个数字,另一个数字是2k-1的索引。

2^k - 1 = [1,3,7, 15, 31, 63...]

例如,如果我有一个列表[1, 4, 3, 6, 2, 10, 8, 19]

这个列表的长度是8。因此,程序应该在2k-1列表中找到一个小于8的数字,在这种情况下,它将是7。

因此,现在它将比较随机列表中的第一个数字(1)和同一列表中的第七个数字(19)。如果它大于第二个数字,它将互换头寸。

在这一步之后,它将继续到4和之后的第7个数字,但这并不存在,所以现在它应该与4之后的第3个数字进行比较,因为3是2k-1中的下一个数字。

因此,它应该将4与2进行比较,如果它们不在正确的位置,则进行交换。因此,这应该一直持续下去,直到我达到2k-1中的1,列表最终将在其中排序。

我需要帮助开始使用此代码。

到目前为止,我已经编写了一个小代码,使2k-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,5,14,17,18,12,7,1,以及9,4,8,2,5,14,17,18,12,7,11完全使用r=7后。使用a=3(跳过中的下一个较小项序列),第一个稀疏子序列=9,2,14,12,当应用于V时给出2,4,8,9,1,5,12,17,18,14,7,11,其余的a = 3排序给出2,1,8,9,4,5,7,18,14,17,11,然后是2,1,5,9,4,8,12,7,11,14,17,18。最后,用a = 1得到1,2,4,5,7,8,9,11,12,14,17,18。

你可能会想,既然最后我们做了一种没有跳过的排序,为什么这可能比一开始只做最后一步要快得多。把它想象成一把梳子浏览序列——注意,在前面的步骤中,我们使用课程梳来获取正确的顺序,使用逐渐精细的梳,直到最后我们的微调处理的是一个几乎排序的序列几乎不需要调整。

p = 0
x = len(V) #finding out the length of V to find indexer in a
for j in a: #for every element in a (1,3,7....)
    if x >= j: #if the length is greater than or equal to current checking value
        p = j #sets j as p 

因此,它找到了应该将列表中的第一个数字与之进行比较的距离,但现在我需要写一些东西,一直这样做,直到距离超出范围,所以它从3切换到1,然后只检查较小的距离,直到列表排序。

您实际描述的排序算法称为Combsort。事实上,更简单的bubblesort是combsort的一种特殊情况,其中间隙始终为1并且不变。

既然你一直纠结于如何开始,下面是我的建议:

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

最新更新