冒泡排序
冒泡排序的思想:
将元素两两之间进行比较,谁大就往后移动,直到将最大的元素排到最后面,一直循环,就形成了有序的序列
# 冒泡排序 def bubble(arr): length = len(arr) for i in range(length-1): for j in range(length-1-i): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr arr = [2, 1, 3, 56, 32, -9, 3, 0, 34, 334, 5] print('冒泡排序结果:', bubble(arr)) 结果: 冒泡排序结果: [-9, 0, 1, 2, 3, 3, 5, 32, 34, 56, 334] # 找出队列第2个最大的数(根据冒泡排序实现的) def bubble_k(arr, k): length = len(arr) for i in range(k): for j in range(length-1-i): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr[-k] arr = [2, 1, 3, 56, 32, -9, 3, 0, 34, 334, 5] print('冒泡结果:', bubble_k(arr, 2)) 结果: 冒泡结果:56
冒泡排序优化1:
设定一个变量为False,如果元素之间交换了位置,将变量重新赋值为True,最后再判断,在一次循环结束后,变量如果还是为False,则brak退出循环,结束排序。
(因为当一次都没有交换位置的话就代表这是一个有序的序列,就不用再去执行后面的循环了)def bubble_sort(arr): for i in range(len(arr) - 1): flag = False for j in range(len(arr) - 1 - i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] flag = True if not flag: break return arr arr = [2, 1, 3, 56, 32, -9, 3, 0, 34, 334, 5] print('冒泡排序结果:', bubble_sort(arr))
冒泡排序优化2:就是在优化方案1的基础上,反正排一次(从左到右是取大值,从右到左是取小值),这样可以减少循环次数,提高算法效率
def bubble_sort(arr): for i in range(len(arr) - 1): flag = False for j in range(len(arr) - 1 - i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] flag = True if flag: flag = False for j in range(len(arr) - 2 - i, 0, -1): if arr[j - 1] > arr[j]: arr[j], arr[j - 1] = arr[j - 1], arr[j] flag = True if not flag: break return arr arr = [2, 1, 3, 56, 32, -9, 3, 0, 34, 334, 5] print('冒泡排序结果:', bubble_sort(arr)) 结果: 冒泡排序结果: [-9, 0, 1, 2, 3, 3, 5, 32, 34, 56, 334]