Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python排序技术_Python_Algorithm_Sorting - Fatal编程技术网

Python排序技术

Python排序技术,python,algorithm,sorting,Python,Algorithm,Sorting,我正在尝试创建一种对数字列表进行排序的排序技术。但它所做的是比较两个数字,第一个是列表中的第一个数字,另一个数字是2k-1的索引 例如,如果我有一个列表[1,4,3,6,2,10,8,19] 这个列表的长度是8。因此,程序应该在2k-1列表中找到一个小于8的数字,在本例中为7 现在,它将比较随机列表(1)中的第一个数字与同一列表(19)中的第七个数字。如果大于第二个数字,它将交换位置 在这一步之后,它将继续到4和之后的第7个数字,但这并不存在,因此现在它应该与4之后的第3个数字进行比较,因为3是

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

例如,如果我有一个列表
[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,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,剩余的
a=3
排序给出2,1,8,9,4,5,12,7,18,14,17,11,然后是2,1,5,9,4,8,12,11,14,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,然后只检查较小的距离,直到列表被排序。

您描述的排序算法实际上被调用。事实上,更简单的bubblesort是combsort的一个特例,其中间隙始终为1且不变

既然你一直在思考如何开始,我建议你:

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

  • 您是从哪里了解到这种“排序技术”的?能否举例说明您提供的示例列表的输出内容?我很难理解你的描述。这应该是一个错误吗?因为如果是的话,我认为你不太明白这个想法。您应该使用插入排序来执行子排序,并且应该为给定间隙长度的每个子序列执行子排序,而不仅仅是从第一个元素开始的序列。看起来它可能是一个组合排序。这是我能想到的使用“间隙”概念的唯一其他排序算法。步骤1:编写。第2步:修改插入排序以获取开始和跨步参数,以便可以在列表的子列表上使用它。第3步:编写一个例程,用该算法指定的开始和步幅运行插入排序。
    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