2012-06-13 48 views
0

对于我的软件主要工作,我必须创建一个程序。总而言之,高分列表需要在可以写入文件之前进行排序。要做到这一点,我正在使用冒泡排序,我不能使用内置的排序功能。正在读取数据的文本文件存储在嵌套列表中。该文本文件是这样的:嵌套(高分)列表的气泡排序错误 - python

NameOne 
10 
NameTwo 
15 
NameThree 
9 

这是冒泡排序的代码,我有,但不工作:

b_not_sorted = True 
while b_not_sorted: 
    counter = 0 
    b_not_sorted = False 
    for counter in range(len(highest_scores) - 1): 
     if highest_scores[counter] < highest_scores[counter + 1]: 
      b_not_sorted = True 
      highest_scores[counter], highest_scores[counter+1] = highest_scores[counter+1], highest_scores[counter] 
     counter = counter + 1 

我需要进行排序从最高到最低的分数。任何帮助将不胜感激,你将被记入我的计划学分:)。谢谢。

+0

你被允许使用'for'循环吗? –

+0

是的,我可以用任何方式编码bubblesort,只要它真的起作用 – jaz

+0

我会为你的内部循环使用'for'循环而不是'while循环。它可以节省你不得不手动增加计数器的次数,并且使它更明显地表明你在做什么(遍历highest_scores的索引)。 –

回答

5

这里有一个提示:

检查你的外循环while多少次运行。它应该运行不止一次,对吗?无论发生什么,总是会导致循环退出的事情呢?

尝试逐行检查代码并查看每个点发生了什么。

外循环结束时的语句b_not_sorted = False导致外循环在执行一次后退出。您需要将该声明移至代码的另一部分。试着在你的头上改变b_not_sorted名称I_still_need_to_go_through_the_list

显然,在第一行:

while I_still_need_to_go_through_the_list: 

它应该是真实的,因为你没有在列表上消失的。你不知道它是否有序。

和行之后:

if highest_scores[counter] < highest_scores[counter + 1]: 

当然,那么我们还需要进行另一次传球,因为我们刚刚作出了一个改变到列表中,需要确保不需要进一步的修改。

但是如果没有改变呢? I_still_need_to_go_through_the_list然后应该是False。嗯。如果我们把I_still_need_to_go_through_the_list = False正确之前的for循环,那么它将是False除非我们对列表进行了更改,这正是我们想要的。

+3

+1没有发布作业标记的答案 – shiva

+0

谢谢,但是如何让while循环继续循环遍历整个程序,以便它不会在一次传递后停止?请提供另一个提示! (或答案,哈哈) – jaz

+0

@jaz:你发布的代码的最后一行会发生什么?您将'b_not_sorted'设置为'False'。那之后会发生什么? –

0

你在第一次迭代后正在做b_not_sorted = False,但它不应该在那里!算法在完成排序之前停止。

你应该做的,而不是只b_not_sorted = Trueif highest_scores[counter] < highest_scores[counter + 1]


此外,交换代码可在Python看起来更美观。而不是使用temp_var的只是这样做:

highest_scores[counter], highest_scores[counter+1] = highest_scores[counter+1], highest_scores[counter] 

Python的风格指南建议您在shoudn't陈述if== True== False。这样做:

while b_not_sorted: 
+0

谢谢!我已经实现了你所说的,但while循环不会重复所有的分数,并且在一次传球后停止 – jaz

+0

@jaz确保你已经将'b_not_sorted = True' *移到了'if'中。 –

+0

它在'if'语句中吗? – jaz