如何在冒泡排序中每次遍历时打印出列表的状态?

3

我有一个问题,想在Python 2.7中如何获得以下输出。

>> bubble(['abe','Ada','bak','bAr'], False)
['Ada', 'bak', 'bAr', 'abe']
['bak', 'bAr', 'Ada', 'abe']
['bAr', 'bak', 'Ada', 'abe']
>> bubble(['Adm','abe','bAr','bak'], False)
['Ada','bAr','bak','abe']
['bArt','bak','Ada','abe']

以下是翻译的结果:

这些函数的输入包括以下内容:一个字符串列表(L),以及一个布尔值,表示升序(asc=True)或降序(asc=False)的字典顺序。在两种情况下,都会输出列表状态,并在每一次排序完成后打印出来。

def bubble(L, asc):
  n = len(L)
  if asc == False:
    for i in range(1,n):
      for ii in range(n-i):
        if L[ii].upper()<L[ii+1].upper():
          tmp=L[ii]  
          L[ii]=L[ii+1]
          L[ii+1]=tmp
    print L
  if asc == True:
    for i in range(1,n):
      for ii in range(n-i):
        if L[ii].upper()>L[ii+1].upper():
          tmp=L[ii]  
          L[ii]=L[ii+1]
          L[ii+1]=tmp
    print L

此外,我能否将当前访问列表项的方式替换为i-1i而不是ii+1

你的意思是要改变访问列表项的方式吗(用i-1,i而不是i,i+1访问)? - Andriy Ivaneyko
是的,那就是我想做的,但我不知道该怎么做。我尝试了不同的方法,但似乎它并没有遍历整个列表。 - R.Yamada
2个回答

1
在内部循环结束后打印它。
def bubble(L, asc):
   n = len(L)
   if asc == False:
      for i in range(1,n):
        for ii in range(n-i):
            if L[ii].upper()<L[ii+1].upper():
                tmp=L[ii]  
                L[ii]=L[ii+1]
                L[ii+1]=tmp
        print L
  if asc == True:
    for i in range(1,n):
        for ii in range(n-i):
            if L[ii].upper()>L[ii+1].upper():
                tmp=L[ii]  
                L[ii]=L[ii+1]
                L[ii+1]=tmp
        print L

对于你回答的第二部分,你可以使用内层循环:

for ii in range(n-1,i,-1)。// 这会倒序执行循环。

      for i in range(1,n):
            for ii in range(n-1,0,-1):
                if L[ii-1].upper()<L[ii].upper():
                    tmp=L[ii-1]  
                    L[ii-1]=L[ii]
                    L[ii]=tmp

你是这个意思,对吗?

非常感谢。这对我帮助很大。您在代码之前的解释很有帮助。 - R.Yamada
没问题。如果这个答案对你有用,请接受它。 - Priyansh Goel
我不想反转循环顺序。我已经重新用更好的方式表达了我的问题。对于误解,我很抱歉。 - R.Yamada
已更新答案。请确认您是否指的是同一件事。 - Priyansh Goel
@R.Yamada:看起来还好吗? - Priyansh Goel
是的,代码运行良好。我还想获得以下输出。但是,目前的代码并没有给出相同的输出。>> bubble(['Adm','abe','bAr','bak'], False) ['Ada','bAr','bak','abe'] ['bArt','bak','Ada','abe'] - R.Yamada

1
使用range方法的特性,允许您以相反的顺序进行迭代。
print range(1,3) # [1,2]
print range(3-1, 0, -1) # [1,2]

顺便说一下,你可以避免循环代码的重复(删除条件if asc == Falseif asc == True)。要做到这一点,请使用以下函数(我已添加注释):
def bubble(L, asc=False):
   n = len(L)
   # passing -1 as lest argument of range is allow to iterate in reverse order
   for i in range(n-1, 0, -1):
       for ii in range(n-1-i, 0, -1):
           # you assign boolean value which depends on `asc` param to comparison_result
           comparison_result = L[ii-1].upper() > L[ii].upper() if asc else L[ii-1].upper() < L[ii].upper()
           # check bool of comparison_result 
           if comparison_result:
               tmp=L[ii-1]
               L[ii-1]=L[ii]
               L[ii]=tmp
   print L


print bubble(['1', 'a', 's'])

comparison_result =  if asc else L[ii-1].upper() < L[ii].upper()

等价于:

if asc:
   comparison_result = L[ii-1].upper() > L[ii].upper()
else:
   comparison_result = L[ii-1].upper() < L[ii].upper()

谢谢。您的描述非常易于理解。我学到了更多关于Python编程的知识。 - R.Yamada
@R.Yamada 没有问题 :) 希望对你有用!此外,你可以看一下我在这里的回答:https://dev59.com/kGw05IYBdhLWcg3wXAqF#35977481 ,其中包含了使用 range 方法获取反转数组的详细说明 :) 祝你愉快! - Andriy Ivaneyko
当我尝试运行程序时,出现了一个错误。UnboundLocalError: local variable 'comparison_result' referenced before assignment. 你知道为什么会发生这种情况吗? - R.Yamada
@R.Yamada 这意味着您正在尝试在变量被赋值之前使用它。您可以查看 https://dev59.com/t3RA5IYBdhLWcg3wtwSe,其中有更多的解释... - Andriy Ivaneyko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接