冒泡排序

冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

最简单的交换
//初级版,并非符合冒泡排序的思想
//(java)
void BubbleSort(List<int> list)
{
	int i,j;
	for(i = 1; i < list.size(); i++)
	{
		for(j = i+1; j< list.size(); j++)
		{
			//比较
			if( list.get(i) > list.get(j) )
				swap(list,i,j);
		}
	}
}

这段代码严格意义上说并不符合冒泡排序的思想,因为不满足“两两比较相邻记录”。相率比较低。

简单的举例

冒泡排序基本实现
void BubbleSort(list<int> list)
{
	int i,j;
	for(i = 1; i < list.size(); i++)
	{
		for(j = list.size()-1 ; j>=i; j--)
		{
			//比较
			if( list.get(j) > list.get(j + 1) )
				swap(list,j,j+1);
		}
	}
}

稳定排序:在每次循环中,并没有改变任意两个元素的次序,是稳定的。
在这里插入图片描述
在这里插入图片描述

冒泡排序的优化

如果要排序的序列是 {2,1,3,4,5,6,7,8,9},除了第一和第二个数据交换之后就已经是排序好了,但是程序还是不依不饶的遍历所有数据,后面的这些遍历和比较都是不必要的。
在这里插入图片描述

//增加标记变量flag来实现
void BubbleSort(list<int> list)
{
	int i,j;
	boolean flag = true;
	for(i = 1; i < list.size() && flag; i++)
	{
		//初始化flag,表示是否已经确定有序了
		flag = false;
		for(j = list.size()-1 ; j>=i; j--)
		{
			//比较
			if( list.get(j) > list.get(j + 1) )
			{
				swap(list,j,j+1);
				//如果有数据交换则置为true
				//说明还不确定已经是有序的
				flay = true;
			}
		}
	}
}
冒泡排序复杂度分析

最好的情况是排序之前已经是 有序的,只需要 n -1 次比较,没有数据交换,时间复杂度为O(n)
最坏的情况是排序前是逆序,需要比较 1+2+3+……+(n -1)= n(n-1)/2,时间复杂度为O( n 2 n^2 n2)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值