排序算法 优化冒泡排序算法

一般的冒泡排序算法一般会进行L->length – 1次外部循环,但是有时候数组在循环到一半时就已经排序好了,但是这时循环还是不断的进行下去,一直做比较操作,尽管没有交换数据,但是做了很多不必要的比较操作。

我们可以在程序中设置一个flag标志位,当发现这一轮中没有交换动作时,就表明该数组是排序好的,这样就可以设置flag为false,退出循环。

#include <stdio.h>    

#define MAXSIZE 100  /* 待排序数组的大小 */

typedef bool Flag;  /* 是否在这一轮循环中有进行数据的交换 */ 

typedef struct
{
	int r[MAXSIZE+1];	/* 待排序数组r,r[0]为哨兵或临时变量 */
	int length;			/* 待排序数组的长度,为了方便理解,不包含r[0]元素 */
}SortList;

/* 优化了的冒泡排序算法 */
void BubbleSort03(SortList *L)
{
	int i,j;
	Flag flag=true;
	int temp;
	/* 如果flag是true说明有数据交换过,否则表明数组已经是顺序的了,退出循环 */
	for(i=1;i<L->length && flag;i++)
	{
		flag=false;
		for(j=L->length;j>i;j--)
		{
			if(L->r[j-1]>L->r[j])
			{
				/* 交换r[j-1]和r[j]的值 */
				temp=L->r[j-1];
				L->r[j-1]=L->r[j];
				L->r[j]=temp;
				flag=true;
			}
		}
	}
}
冒泡排序算法的时间复杂度分析:

最好的情况下,即数组本身是排序好的,这时进行n-1次比较,时间复杂度为O(n);最坏的情况下,即数组是逆序的,需要比较次数为:1+2+3+…+(n-1)=n(n-1)/2,推导出时间复杂度为O(n^2)。

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接: http://www.itzhai.com/data-structure-notes-sorting-algorithm-bubble-sort-algorithm-optimization.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值