Bubble Sort - 冒泡排序


问题

用Bubble Sort对长度为的无序序列从小到大(升序)排序。

解法

将长度为的序列分为左右两个部分,未排序的和已排序的,其中。如图:

BubbleSort6.png

初始时。如图:

BubbleSort7.png

做如下操作:

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函数时,只需要将输入参数变为,就可以将上一次最右边的元素加入的最左边;

上述操作如图:

BubbleSort8.png

BubbleSort9.png

运行一次Bubble函数可以将中最大的元素移动到最左边(长度减1,长度加1)。初始时长度为长度为,只需重复调用次Bubble函数即可完成排序:

function BubbleSort(s, n):
    for k = [n-1, 0]
        Bubble(s, k)

例如对于下图中的数组。从开始向右遍历,依次比较,若则交换两个元素,直到

BubbleSort1.png

BubbleSort2.png

BubbleSort3.png

BubbleSort4.png

然后将中的最大值合并到部分中,再进行新一轮的遍历交换操作。

BubbleSort5.png

每次遍历都可以筛选出中最大的元素,重复次即可对整个数组完成排序,算法结束。

复杂度

Bubble函数的输入规模为,遍历个元素的时间复杂度为,判断两个元素的大小、交换两元素的值的时间复杂度为,该操作的时间复杂度为:

BubbleSort函数的输入规模为,循环调用次Bubble函数,时间复杂度为,调用Bubble的平均输入规模为,该操作的时间复杂度为:

该算法的时间复杂度为。该算法没有额外占用内存(没有动态分配内存),空间复杂度为为

源码

BubbleSort.h

BubbleSort.cpp

测试

BubbleSortTest.cpp