排序算法之冒泡排序

同样的先上这张图


下面分析交换排序之冒泡排序:

冒泡排序和选择排序很相似,都是遍历一趟把最大的元素放到最后面,但选择排序属于选择排序,而冒泡排序属于交换排序,原因在于冒泡排序在找最大元素的时间,两两比较之后会作交换,这样使得一趟排序下来不仅把最大元素放到了后面,同时让前面的元素也更加有序。

原版的冒泡排序较之选择排序效率上不仅没有提高,反而会更差。因为冒泡排序同样也需要nxn的时间,而且冒泡排序还多了很多交换的时间开销。但是,改进版的冒泡排序会比选择排序效率高些,正是前面那些不断的交换,使得冒泡排序有可能提前退出,而不用做n趟排序。

冒泡排序最差及平均时间复杂度为O(n2),最好情况只需要一趟排序,时间复杂度为O(n)。

冒泡排序空间复杂度为O(1)。

冒泡排序在交换过程中只有前面元素大于后面元素才会作交换,所以相同元素的相对位置不会被破坏,因此它是稳定的。

AS代码:

		/**
		 * 冒泡排序
		 * 外层循环标记已经排好序的个数
		 * 内层循环遍历前面未排序的元素,两两比较做交换,把最大元素换到最后
		 */
		private function BubbleSort(arr:Array):void{
			var finish:Boolean=true;
			var temp:Number;
			for(var i:int=0;i<arr.length-1;i++){
				for(var j:int=1;j<arr.length-i;j++){
					if(arr[j-1]>arr[j]){
						temp=arr[j-1];
						arr[j-1]=arr[j];
						arr[j]=temp;
						finish=false;
					}
				}
				if(finish){
					break;
				}
			}
		}

C++代码

/*
* 冒泡排序
* 最好O(n),最坏及平均O(n2)
* O(1)
* 稳定
*/
template <typename T>
void SortHelp<T>::bubbleSort(T l[], int length) {
	bool bSwap ;
	for (int i = 0; i < length; i++)
	{
		bSwap = false;
		for (int j = 0; j < length - i - 1; j++)
		{
			if (l[j] > l[j + 1])
			{
				l[j] += l[j + 1];
				l[j + 1] = l[j] - l[j + 1];
				l[j] = l[j] - l[j + 1];
				bSwap = true;
			}
		}
		if (!bSwap)
		{
			break;
		}
	}
}


总结,冒泡排序平均及最坏时间复杂度为O(n2),最好时间复杂度为O(n),空间复杂度为O(1),稳定。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值