Python排序技术
我正在尝试创建一种对数字列表进行排序的排序技术。但它所做的是比较两个数字,第一个是列表中的第一个数字,另一个数字是2k-1的索引 例如,如果我有一个列表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是
[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且不变 既然你一直在思考如何开始,我建议你:
您是从哪里了解到这种“排序技术”的?能否举例说明您提供的示例列表的输出内容?我很难理解你的描述。这应该是一个错误吗?因为如果是的话,我认为你不太明白这个想法。您应该使用插入排序来执行子排序,并且应该为给定间隙长度的每个子序列执行子排序,而不仅仅是从第一个元素开始的序列。看起来它可能是一个组合排序。这是我能想到的使用“间隙”概念的唯一其他排序算法。步骤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