- 冒泡排序算法
- 基础冒泡排序
例题1.使用冒泡排序算法对列表a升序排序。
函数名:bubble_sort(a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
算法思想:外层循环累计排序轮数,同时控制待排序数组的右边界,即a[0..i]为待排序部分;内层循环扫描a[0..i-1],比较相邻元素,并通过交换元素值的方式将最大值冒泡到最右端
def bubble_sort(a):
for i in range(len(a)-1, 0, -1):
for j in range(i):#向右扫描,将最大值冒泡到右端
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
基础冒泡排序变例:外层循环变量i累计排序轮数
变例1:向右扫描,将最大值冒泡到右端
def bubble_sort_12(a):
for i in range(1, len(a)):#变量i累计排序轮数
for j in range(len(a)-i):#将最大值冒泡到右端
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
变例2:向左扫描,将最小值冒泡到左端
def bubble_sort_13(a):
for i in range(1, len(a)):#外层循环累计排序轮数
for j in range(len(a)-1, i-1, -1):#向左扫描
if a[j] < a[j-1]:
a[j], a[j-1] = a[j-1], a[j]
- 冒泡排序改进:设置交换操作标志
例题2.使用冒泡排序改进算法对列表a升序排序。
函数名:bubble_sort_2(a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
def bubble_sort_2(a):
for i in range(len(a)-1, 0, -1):
swapFlag = False #先假设未做交换操作
for j in range(i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swapFlag = True #设置交互操作标志
if not swapFlag: break #无交换操作,表示已完成排序,退出循环
- 冒泡排序改进:更新右边界,减少扫描范围
例题3.使用冒泡排序改进算法对列表a升序排序。
函数名:bubble_sort_3(a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
def bubble_sort_3(a):
left, right = 0, len(a)-1
while left < right:
swapPos = left
for j in range(left,right): #顺序扫描
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swapPos = j
right = swapPos #修改待排序数组的右边界
- 冒泡排序改进:双向冒泡(鸡尾酒排序)
例题4.使用冒泡排序改进算法对列表a升序排序。
函数名:bubble_sort_4(a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
def bubble_sort_4(a):
left, right = 0, len(a)-1
while left < right:
swapPos = left #先假设最后一次发生交换操作的位置为left
for j in range(left,right): #顺序扫描a[left..right-1]
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swapPos = j
right = swapPos #修改待排序数组的右边界
for j in range(right,left,-1): #逆序扫描a[left+1..right]
if a[j] < a[j-1]:
a[j],a[j-1] = a[j-1],a[j]
swapPos = j
left = swapPos #修改待排序数组的左边界