冒泡排序是一种比较简单的 稳定排序 算法,效率不高,因此实际当中用到的机会并不多。但作为快速排序算法的基础,还是有必要了解一下。
顾名思义,冒泡就是指大的数字(气泡)会优先从底部升到顶端。具体实现的方式就是重复的 交换排序,通过两两比较不断地将大的数字右移。具体看下面的GIF图就很清楚了。
height="200" width="320" src="https://img-blog.csdn.net/20170118231315502?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2h1emZhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
冒泡排序在 最坏情况下的时间复杂度是O(n²),最坏的情况比如将一组降序排好的数据按升序排列。
下面是一个相对效率较高的冒泡排序实现,通过设置一个标志位来控制提前跳出。
// 冒泡排序
void BubbleSort(int data[], int n)
{
bool swapped;
int temp_data;
for(int i=n-1; i>=0; i--)
{
swapped = false;
for(int j=0; j<i; j++)
{
if (data[j+1] < data[j])
{
// 交换数据
temp_data = data[j+1];
data[j+1] = data[j];
data[j] = temp_data;
swapped = true;
}
}
if(false == swapped)
break;
}
}
PS. 上面程序中如果把data[j+1] < data[j] 改为 data[j+1] <= data[j],那么就不是稳定排序了。这说明了,排序算法的稳定性其实还和具体实现有关。
下面再给一个链接用来演示冒泡的原理:
http://www.cs.armstrong.edu/liang/animation/web/BubbleSort.html
下面给一个Flash链接,用来演示不同数据分布情况下,冒泡排序的复杂度。
https://www.toptal.com/developers/sorting-algorithms/bubble-sort