Bubble Sort - 冒泡排序
问题
用Bubble Sort对长度为的无序序列从小到大(升序)排序。
解法
将长度为的序列分为左右两个部分,未排序的和已排序的,其中。如图:
初始时。如图:
对做如下操作:
function Bubble(s, k):
for i = [0, k]
if s[i] > s[i+1]
swap(s[i], s[i+1])
(1) Bubble函数第2行:从左向右遍历中的所有元素;
(2) Bubble函数第3-4行:比较和,若则交换两个元素,否则不做任何操作。这样一次操作会将中的最大元素移动到最右边,下一次调用Bubble函数时,只需要将输入参数变为,就可以将上一次最右边的元素加入的最左边;
上述操作如图:
运行一次Bubble函数可以将中最大的元素移动到最左边(长度减1,长度加1)。初始时长度为,长度为,只需重复调用次Bubble函数即可完成排序:
function BubbleSort(s, n):
for k = [n-1, 0]
Bubble(s, k)
例如对于下图中的数组,为,为。从开始向右遍历,依次比较和,若则交换两个元素,直到。
然后将中的最大值合并到部分中,再进行新一轮的遍历交换操作。
每次遍历都可以筛选出中最大的元素,重复次即可对整个数组完成排序,算法结束。
复杂度
Bubble函数的输入规模为,遍历个元素的时间复杂度为,判断两个元素的大小、交换两元素的值的时间复杂度为,该操作的时间复杂度为:
BubbleSort函数的输入规模为,循环调用次Bubble函数,时间复杂度为,调用Bubble的平均输入规模为,该操作的时间复杂度为:
该算法的时间复杂度为。该算法没有额外占用内存(没有动态分配内存),空间复杂度为为。