1、核心算法
排序算法,一般都实现为就地排序,输出为升序
扩大有序区,减小无序区。图中红色部分就是增大的有序区,反之就是减小的无序区
每一趟比较中,将无序区中所有元素依次两两比较,升序排序将大数调整到两数中的右侧
每一趟比较完成,都会把这一趟的最大数推倒当前无序区的最右侧
2、基本实现
2.1、交换排序
2.1.1、说明
相邻元素两两比较大小,有必要则交换
元素越小或越大,就会在数列中慢慢的交换并“浮”向顶端,如同水泡咕嘟咕嘟往上冒
2.1.2、流程图

3、代码
nums = [9, 8, 1, 2, 3, 4, 5, 6, 7]
length = len(nums) # 4
count = 0
count_swap = 0
# i 控制趟数
for i in range(length-1):
# 假设这一趟不需要交换了
finished = True # 定义标记
# 本趟内两两比较,大数换到右边
# 2个数比1下,3个数比2下,那么比较次数就是当前比较数个数-1
for j in range(length-1-i): # j 为0, 1, 2
count += 1
if nums[j] > nums[j+1]: # 只有大于才交换,小于等于就不用了
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp
count_swap += 1
finished = False # 有一次交换就要标记为False
if finished:
break
print(nums)
print('result = ', nums)
print(count, count_swap)
4、小结
冒泡法需要数据一趟趟比较
可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交
换,继续下一轮排序
最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数1,...,n-1之和n(n-1)/2
最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1
时间复杂度O(n2
)