冒泡排序是一种交换排序,他的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
首先做一下排序前的准备工作,看如下代码:
#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);