我想编写一个能够高效执行这种“奇怪”排序的函数(我对这个伪代码感到抱歉,在我看来,这是引入问题的最明显的方式) :如何在Python中编写这种“奇怪的”排序
l=[[A,B,C,...]]
while some list in l is not sorted (increasingly) do
find a non-sorted list (say A) in l
find the first two non-sorted elements of A (i.e. A=[...,b,a,...] with b>a)
l=[[...,a,b,...],[...,b+a,...],B,C,...]
两个重要的事情应该提到:
- 排序是依赖于前两个 未分选元素的选择:
if A=[...,b,a,r,...], r<a<b
,我们选择 排序WRT到(a,r)
则最终结果将不会一样。这是 为什么我们修复了A
的两个第一个非排序元素。 - 排序这种方式总是会结束。
一个例子:
In: Sort([[4,5,3,10]])
Out: [[3,4,5,10],[5,7,10],[10,12],[22],[4,8,10]]
因为
(a,b)=(5,3): [4,5,3,10]->[[4,3,5,10],[4,8,10]]
(a,b)=(4,3): [[4,3,5,10],[4,8,10]]->[[3,4,5,10],[7,5,10],[4,8,10]]
(a,b)=(7,5): [[3,4,5,10],[7,5,10],[4,8,10]]->[[3,4,5,10],[5,7,10],[12,10],[4,8,10]]
(a,b)=(12,10): [[3,4,5,10],[5,7,10],[12,10],[4,8,10]]->[[3,4,5,10],[5,7,10],[10,12],[22],[4,8,10]]
谢谢您的帮助!
编辑
为什么我会考虑这个问题: 我试图做一些计算与李代数的普遍包络代数。这是由某些生成器x_1,... x_n的乘积生成的数学对象。我们对一个生成集(它等于问题中的有序列表)有一个很好的描述,但是当交换两个生成器时,我们需要考虑这两个元素的换向器(这是问题中元素的总和) )。我没有解决这个问题,因为它接近你能想到的最糟糕的一个。我想知道你会如何以一种好的方式来实现这个目标,所以它是pythonic和fast。我不是要求一个完整的解决方案,只有一些线索。我愿意自己解决。
在你的例子中,你首先选择一个列表'[....,b,a,...]'然后你的新'l '在它的前面再次有这个列表。为什么你不会立即重复,再次选择相同的列表? (或者你的例子有其他问题吗?你的括号在'l = ...'行中是不匹配的。) – BrenBarn
这个过程是否应该做一些有用的工作?它打算解决什么实际问题? – ekhumoro
@BrenBarn谢谢你,是的,有两个错误。 – Nre