排序-冒泡排序

零、数据结构和算法系列目录

数据结构和算法系列目录(不断更新):

http://blog.csdn.net/adrastos/article/details/9093857

一、冒泡排序简介

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

二、冒泡排序的步骤

1. 选择带排序数组的第i个元素(i从1n(元素的个数))
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;
}

六、后续工作

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

七、参考资料

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

如有错误还请各位指正,欢迎大家一起讨论给出指导。

上述程序完整代码下载链接:

https://github.com/zeliliu/BlogPrograms/tree/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%26%E7%AE%97%E6%B3%95/sort/bubble%20sort

最后更新时间2013-07-11

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值