选择排序不适用于某些输入...(或未正确显示)

时间:2016-10-02 22:33:50

标签: python-3.x sorting

我写了一个函数,它有两个列表,华氏值和摄氏值。我使用了一个选择排序方法,应该将值从最小值排序到最大值。可能的Fahr值介于-150和350之间(我写了一个函数来确保输入在这些数字内)。当我键入以下输入时:(30,60,10,-523235,-22,30)它会忽略-523235,但输出为:(10,30,60,-22,30)不是正确。它只排序前3个数字,但一旦输入负数,它就不会排序......我很困惑。

(摄氏值是由我写的另一个函数生成的,用于将Fahr值转换为Cels值,但这对于这个问题并不重要)

def selection_sort_Fahr_Cels(temp_values_Fahr, temp_values_Cels):
    for i in range(0, len(temp_values_Fahr)):
        minIndex = i
        for val in range(i+1, len(temp_values_Fahr)):
            if temp_values_Fahr[val] < temp_values_Fahr[i]:
                minIndex = val

            if minIndex != i:
                temp_values_Fahr[i], temp_values_Fahr[minIndex] = temp_values_Fahr[minIndex], temp_values_Fahr[i]

    for i in range(0, len(temp_values_Cels)):
        minIndex = i
        for val in range(i+1, len(temp_values_Cels)):
            if temp_values_Cels[val] < temp_values_Cels[i]:
                minIndex = val

            if minIndex != i:
                temp_values_Cels[i], temp_values_Cels[minIndex] = temp_values_Cels[minIndex], temp_values_Cels[i]    

    print("                   ", "  Fahr ","     ", "  Cels ")
    print("                   ", "=======","     ", "=======")
    for i in range(len(temp_values_Fahr)):
        print("                   ","{0: 6}{1:14.1f}".format(temp_values_Fahr[i], temp_values_Cels[i]))

    print("                   ", "=======","     ", "=======")

整个程序超过100行,如果需要,我可以发布到整个程序的链接。

更新:我无法使用任何库函数进行排序。

2 个答案:

答案 0 :(得分:0)

你真的不想使用所有复杂的代码来删除非法值并对它们进行排序。有更多的pythonic方式(我只做了Fahr值):

def selection_sort_Fahr_Cels(temp_values_Fahr, temp_values_Cels):
    temp_values_Fahr[:] = sorted(filter(lambda x: x < 350 and x >= -150, temp_values_Fahr))

farh=[30, 60, 10, -523235, -22, 30]
selection_sort_Fahr_Cels(farh,[])
print(farh)

结果(列表就地修改):

[-22, 10, 30, 30, 60]

代码使用您的条件使用filter方法,结果传递给sorted方法,该方法采用可迭代的方法并从中创建一个列表。

更不用说python sorted方法比冒泡排序更有效。

答案 1 :(得分:0)

def selectionsort( aList ):
    for i in range( len( aList ) ):
        least = i
        for k in range( i + 1 , len( aList ) ):
            if aList[k] < aList[least]:
                least = k

        swap( aList, least, i )
    print(aList) 


def swap( A, x, y ):
    tmp = A[x]
    A[x] = A[y]
    A[y] = tmp



selectionsort(aList) 

我找到了更好的选择排序方法。我注意到之前,我没有任何交换方法。