4.5 案例:冒泡排序

冒泡排序是和直接选择排序类似的,每次排序,都确定当前查找范围的最大值(或最小值)。
列表如下:
arr=[23,14,56,1,35,89,99,65,73,44]
我们最终要得到一个从小到大排序的列表。
它的算法是这样的:
1.设定初值i=0
2.设定j=0,k=arr.length-i-2(k代表每次循环的长度)
3.看j+1小于k,如果不是,比较a[j]和a[j+1],如果a[j]更大,互换a[j]和a[j+1],进入第4步;如果i已经是最后一个元素,回到第5步;
4.j++,回到第3步
5.i++,如果i不是列表最后一个元素下标,回到第2步,否则算法结束。
为了更好理解k,下面算法第3、4步的具体演示,此时j=0、k=8开始:
条件满足,发生互换,同时j加1,如下图所示:
条件不满足,没有互换,同时j加1,如下图所示:
条件满足,发生互换,同时j加1,如下图所示:
条件满足,发生互换,同时j加1,如下图所示:
条件不满足,没有互换,同时j加1,如下图所示:
条件不满足,没有互换,同时j加1,如下图所示:
条件满足,发生互换,同时j加1,如下图所示:
条件满足,发生互换,同时j加1,如下图所示:
条件满足,发生互换,同时j加1,如下图所示:
我们会发现,j=9的时候已经找到了一个最大值99,并置于正确的位置,这不是偶然的,因为j=8的时候,就已经换好了。
于是k值的意义就很明显了:确定循环下标的上限。第一轮k的值设为8,下一轮循环,j仍然从0开始,但是k变成了7,也就是j只需要递增到7就可以了,这样可以找到第二大的数,然后放在arr.length-2的位置。

这是冒泡算法的其中一个实现:
arr=[23 , 1 , 56 , 14 , 35 , 89 , 99 , 65 , 73 , 44]
print(arr)
j=2
while j<=len(arr)-1:
    print("===============新一轮循环开始=====================")
    i=0
    while i<len(arr)-j:
        if arr[i] >arr[i+1]:
            arr[i],arr[i+1]=arr[i+1],arr[i]
            print(arr[i],"和",arr[i+1],"互换,结果是:",arr)
        else:
            print(arr[i],"小于",arr[i+1],"不需要,结果是:",arr)
        i+=1
    j+=1