您的位置:首页 > 其它

冒泡算法

2014-12-03 20:43 92 查看

一、冒泡排序简介

先来介绍一下什么是冒泡排序。大家肯定注意过水泡在水中的形成过程,形成是轻气泡不能在重气泡下面,也就是说在扫描带排序数组的时候,从后往前扫面,当遇到“轻”元素时在“重”元素下面时,交换两者的位置。冒泡排序是从带排序数组的末尾开始往前扫描,在每次扫描的时候如果没有发生交换元素,则说明该数组目前的排序已经是有序的,这时就可以跳出循环结束排序。

二、冒泡排序的步骤

1. 选择带排序数组的第i个元素(i从1到n(元素的个数))

2. 选择带排序数组的第j个元素(从n到i + 1)

3. 第j个元素和第j - 1个元素进行比较,如果第j个元素小于第j - 1个元素,交换两者,并设置flag为1(判断每趟是否有交换)。

4. 第j个元素已经到达第i + 1的位置。判断flag是否为1,若为0跳出,若为1跳到第一步。

三、冒泡排序的一些分析

首先,根据上面的步骤可以知道冒泡排序需要比较相邻两个元素的大小,所以它也是比较排序的一种。再来分析一下复杂度。先分析一下空间复杂度,冒泡排序只需要一个辅助空间在交换元素时使用,所以它的空间复杂度为O(1)。对于时间复杂度,如果原来已经是排序好的数组,也就是说最好的情况下它的时间复杂度为O(1),但是当数组恰好是逆序有序,那么这种最坏的情况下时间复杂度为

,而平均情况来讲,它的时间复杂度也为

。所以,冒泡排序不适合大规模数据的排序。另外,从稳定性来说,冒泡排序是一种稳定排序。我们再来分析一下每趟的冒泡排序有什么性质。它每趟排序时比较相邻的两个元素,保证较小的元素在上面,所以它每趟排序下来都将找出数组后面的乱序部分的最小的那个元素,并将其放到了它最终的位置上。也就是说冒泡排序每趟都可以找出一个当前的最小元素来。

四、冒泡排序的例子

这个http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/maopaopaixu.htm上面的例子挺好的,不过貌似chrome打不开,用IE试试吧。

五、代码实现

int
bubble_sort(int *numbers, int length)

{
int i,
j,
temp,
flag;

for(i = 0; i < length; i++)

{
flag = 0;
for(j = length - 1; j > i; j--)

{
if(numbers[j] < numbers[j - 1])

{
temp = numbers[j];
numbers[j] = numbers[j - 1];
numbers[j - 1] = temp;
flag = 1;
}
}
if(0 == flag)
break;

}

return 0;
}

int
bubble_sort(int *numbers, int length)
{
	int i,
		j,
		temp,
		flag;

	for(i = 0; i < length; i++)
	{
		flag = 0;
		for(j = length - 1; j > i; j--)
		{
			if(numbers[j] < numbers[j - 1])
			{
				temp = numbers[j];
				numbers[j] = numbers[j - 1];
				numbers[j - 1] = temp;
				flag = 1;
			}
		}
		if(0 == flag)
			break;
	}

	return 0;
}

六、后续工作

排序的算法还没有介绍完,后续的还会再继续介绍其他的排序算法。

七、参考资料

1. Introduction to Algorithms(Second Edition), Thomas H.Cormen & Charles E.Leiserson

2. Bubble sort, http://en.wikipedia.org/wiki/Bubble_sort
3. 冒泡排序基本思想和算法, http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.1.1.htm
说明:

数据结构和算法博客系列的目录为:http://blog.csdn.net/adrastos/article/details/9093857

如有错误还请各位指正,欢迎大家一起讨论给出指导。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: