七种排序--------冒泡排序(Bubble Sort)

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

首先做一下排序前的准备工作,看如下代码:

#define MAXSIZE 10   //用于排序数组个数的最大值,
typedef struct
{
	int r[MAXSIZE];  
	int length;      //数组长度
}SqList;

void swap(SqList *L,int i,int j)   //交换L中数组r的下标i和j的值
{
	int tmp = L->r[i];
	L->r[i] = L->r[j];
	L->r[j] = tmp;
}

来看一段比较容易理解的冒泡排序代码:

void BubbleSort(SqList *L)
{
	int i,j;
	for(i = 0;i < L->length;i++)
	{
		for(j = i + 1;j <= L->length;j++)
			if(L->r[i] > L->r[j])
				swap(L,i,j);
	}
}

这段代码严格意义上来说,不算是标准的冒泡排序算法,他只能算是最简单的交换排序而已。他的就是让每一个关键字都和他后面的一个关键字比较,如果大则交换,这样第一位置的关键字在一次循环后一定变成了最小值,经过length - 1次循环后便完成了排序。

下面看一下真正的冒泡排序算法:

void BubbleSort(SqList *L)
{
	int i,j;
	for(i = 0;i < L->length;i++) //注意j是从后往前循环
	{
		for(j = L->length-1;j > i;j--)
		{
			if(L->r[j] > L->r[j - 1])  //若前者大于后者(注意这里与上一个算法的差异)
				swap(L,j,j - 1);
		}
	}
}

假设我们待排序的关键字序列是{9,1,5,8,3,7,4,6,2},当 i = 0 时,变量 j 由 8 反向循环到 1 ,逐个比较,将较小值jiao交换到前面,知道最后找到最小值放在了第一的位置,如此往复。在不断循环的过程中,除了将关键字1 放在了第一的位置,还将关键字 2 从第九的位置放到了第三的位置,显然这一算法比前面的好一些,当shu数据比较多的时候,这种差异就会体现出来。较小的数字就像气泡般浮到上面,因此这种排序被命名为冒泡排序。

冒泡排序优化:

如果待排序的序列为{2,1,3,4,5,6,7,8,9},也就是说,除了第一第二的关键字需要交换以外,别的已经不需要排序了,如果还遍历的话就会比较浪费时间。对此,可以设置一个flag进行判断,具体代码如下:

void BubbleSort(SqList *L)
{
	int i,j;
	int flag = true;    //用flag来标记
	for(i = 0;i < L->length && flag;i++)  //若flag为false则退出循环
	{
		flag = false;
		for(j = L->length-1;j > i;j--)
		{
			if(L->r[j] > L->r[j - 1])
			{
				swap(L,j,j - 1);
				flag = true;             //若有数据交换,则flag为true
			}
		}
	}
}

其时间复杂度为O(n*n);

猜你喜欢

转载自blog.csdn.net/yue_jijun/article/details/81114198
今日推荐