冒泡排序算法的原理:
比较相邻的元素,如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或
降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒
泡排序”。
以[9,5,4,3,2]为例:
第一轮:
第一次:9>5===>[5,9,4,3,2]
第二次:9>4===>[5,4,9,3,2]
第三次:9>3===>[5,4,3,9,2]
第四次:9>2===>[5,4,3,2,9]
第一轮排序结果:[5,4,3,2,9]
第二轮:
第一次:5>4===>[4,5,3,2,9]
第二次:5>3===>[4,3,5,2,9]
第三次:5>2===>[4,3,2,5,9]
第二轮排序结果:[4,3,2,5,9]
第三轮:
第一次:4>3===>[3,4,2,5,9]
第二次:4>2===>[3,2,4,5,9]
第三轮排序结果:[3,2,4,5,9]
第四轮:
第一次:3>2===>[2,3,4,5,9]
第四轮排序结果:[2,3,4,5,9]
总结:
1.对一个长度为n的数组排序,需要排n-1轮;
2.第i轮排序,需要n-1-i次;
算法:
1.使用for循环控制排序的轮数,数组的长度为n,排序的轮数为n-1;
2.使用内嵌for循环控制每轮排序的次数,n-1-k,k为第k轮排序;
3.如果arr[i]>arr[i+1],arr[i+1]与arr[i]位置调换;
4.外层循环结束,返回数组
代码实现:
def bubble(arr):
n=len(arr)
for k in range(n-1):
for i in range(n-1-k):
print("第%d轮第%d次排序前:"%(k+1,i+1),arr)
if arr[i]>arr[i+1]:
arr[i],arr[i+1]=arr[i+1],arr[i]
print("第%d轮第%d次排序后:"%(k+1,i+1),arr)
return arr
时间复杂度:
冒泡排序一共遍历了n-1 + n-2 + … + 2 + 1 = n * (n-1) / 2 = (n2- n)/2次, 最大的影响
因子是n2 因此冒泡排序总的平均时间复杂度为 O(n2)