冒泡排序
冒泡排序的英文Bubble Sort,是一种最基础的交换排序。
例:有8个数组成一个无序数列:5,8,6,3,9,2,1,7,希望从小到大排序。
按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置,过程如下:
1)首先让5和8比较,发现5比8要小,因此元素位置不变。
2)接下来让8和6比较,发现8比6要大,所以8和6交换位置。
3)继续让8和3比较,发现8比3要大,所以8和3交换位置。
4)继续让8和9比较,发现8比9要小,所以元素位置不变。
5)接下来让9和2比较,发现9比2要大,所以9和2交换位置。
6)接下来让9和1比较,发现9比1要大,所以9和1交换位置。
7)最后让9和7比较,发现9比7要大,所以9和7交换位置。
这样一来,元素9作为数列的最大元素,就像是汽水里的小气泡一样漂啊漂,漂到了最右侧。
这时候,我们的冒泡排序的第一轮结束了。数列最右侧的元素9可以认为是一个有序区域,有序区域目前只有一个元素。
重复以上过程。
原始的冒泡排序是稳定排序。由于该排序算法的每一轮要遍历所有元素,轮转的次数和元素数量相当,所以时间复杂度是O(N^2) 。
代码:
>>import random
>>#定义冒泡排序函数
>>def bubble_sort(array):
for i in range(len(array)): #外循环,每循环一次使得有序的数增加一个
indicator = False #设置指示器,没有交换时表示array已经有序,用于结束循环
for j in range(len(array)-1-i): #内循环,每循环一次将无须数中最大数提取
if array[j] > array[j+1]:
array[j], array[j+1] = array[j+1], array[j]
indicator = True
if not indicator: #没有交换时,结束循环
break
>>#验证算法
>>array = random.sample(range(100), 10) #随机取得10个数字
>>print(array) #排序前
>>bubble_sort(array) #调用冒泡排序函数
>>print(array) #排序后