2016-10-02 53 views
0

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

(被其他功能我写了转换的法尔值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行,我可以如果需要,发布链接到整个程序。

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

+0

https://ideone.com/GyYQIQ <---这是完整程序的链接,它是未完成的,并且是这样写的,因为我打算这样。即使不需要,它也意味着具有多种功能。 – Spencer456

回答

0

你并不是真的想要使用所有复杂的代码来删除非法值并对它们进行排序。还有一个更Python的方式(我只是做了法尔值):

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方法比泡泡排序更高效。

+0

我需要为过滤器编写一个单独的函数。我需要使用get_temperatures函数或类似的东西来删除非法值。你的方法被记录下来,并且非常感谢你。之前我应该​​注意到,我不能使用任何库函数。 – Spencer456

+0

另外,是不是我显示的方法,选择排序?我可能会感到困惑.. – Spencer456

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) 

我发现了一个更好的选择排序方法。我注意到之前,我没有任何交换方法正在进行。

+0

在Python中不需要使用temp来交换。 A [x],A [y] ='A [y],A [x]'与swap(A,x,y)'做同样的事情。你在这个答案中的代码看起来比问题中的代码更加整洁,但主要只是你使用了较短的变量名。 – Blckknght