梳理分拣程序

时间:2017-04-07 23:59:48

标签: python list sorting

我正在尝试在python中编写一个程序,它应该对列表中的列表进行排序。

示例 -

List before sorting: [[2, 1], [2, 2], [3, 3], [3, 1], [1, 1], [1, 2]] 
List after sorting: [[1, 1], [1, 2], [2, 1], [2, 2], [3, 1], [3, 3]]

List before sorting: [[3, 3], [2, 2], [1, 2], [2, 1], [3, 1], [1, 1]]
List after sorting: [[1, 1], [2, 1], [1, 2], [2, 2], [3, 1], [3, 3]]

List before sorting: [[1, 1], [3, 3], [2, 1], [2, 2], [1, 2], [3, 1]]
List after sorting: [[1, 1], [1, 2], [2, 1], [2, 2], [3, 1], [3, 3]]

我的代码:

import math

def combsort(list1):
    gap = len(list1)
    shrink = 1.3
    sorted = False

    while sorted == False:
        gap = gap/shrink
        if gap > 1:
            sorted = False
        else:
            gap = 1
            sorted = True

        i = 0
        while i + gap < gap:
            distance1 = math.sqrt(list1[i[0]]**2 + list1[i[1]]**2)
            distance2 = math.sqrt(list1[i+gap[0]]**2 + list1[i+gap[1]]**2)
            if distance1 > distance2:
                temporary = list1[i]
                list1[i] = list1[i + gap]
                temporary = list1[i + gap]
                sorted = False
            i = i + 1

list1 = [[2, 1], [2, 2], [3, 3], [3, 1], [1, 1], [1, 2]] 
combsort(list1)
print(list1)

我的代码不起作用并打印出完全相同的列表。有什么帮助吗?

这就是我要遵循的内容:

  

梳理排序是冒泡排序的变体,通常可以执行更有效的排序。它通过将列表末尾附近的低值进一步向列表前面移动而不是在早期迭代期间进行冒泡排序来实现此目的。

     

实现一个名为combsort的函数,它执行以下操作:

     
      
  1. 将包含表示2D空间中x / y点的信息的2D列表作为输入。列表中的每个项目都是一个包含2的列表   项目x和y坐标。例如,列表可能是[[0,   1],[2,1],[3,3],[1,1],......]
  2.   
  3. 列表项使用梳理排序算法执行就地排序(即,不创建新列表,但修改原始列表)   对2D列表进行排序,使得欧几里德距离较低的点为   原点(0,0)出现在列表的前面。在这种情况下,你是   比较距离而不是直接比较列表值 - 它可能   有用的实现和使用距离计算功能。注意 -   点(x,y)与原点(0,0)的欧几里德距离可以是   用下式计算:距离(x,y)=�! +�!
  4.   
  5. 不返回值。由于输入列表已按位排序,因此将直接修改输入列表,并反映这些修改   在函数外部,因此不需要返回值。
  6.   

2 个答案:

答案 0 :(得分:0)

while循环永远不会被执行,因为它的条件不能为真:

while i + gap < gap:

提示:在程序运行时使用更多的print语句或调试器来检查事物的值。

答案 1 :(得分:0)

错误在您的while声明中,应该是:

while i + gap < len(list1):

pseudocode here所示。目前永远不会输入while循环...这会隐藏您的其他问题(见下文)。

您正在索引错误的二维列表:

list1[i[0]] #get first item in list `i` and use that number to index into list1
list1[i][0] #get the ith sublist in list1 and get its first item

您需要确保对列表索引使用整数:

gap = int(gap/shrink)

对于最后的结局......你交换了作业的顺序,破坏了你的交换逻辑

temporary = list1[i + gap] #wrong
list1[i + gap] = temporary #should be this

您也可以执行此操作without the use of temporary in Python

list1[i+gap], list1[i] = list1[i], list1[i+gap]

完成所有这些更改后,代码按预期工作:

>>>combsort([[3, 3], [2, 2], [1, 2], [2, 1], [3, 1], [1, 1]])
[[1, 1], [2, 1], [1, 2], [2, 2], [3, 1], [3, 3]]