一、概念
冒泡排序(Bubble Sort):一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
二、排序用到的结构与函数
#define MAXSIZE 10 /*用于要排序数组个数最大值,可根据需要修改*/
typedef struct
{
int r[MAXSIZE+1]; /*用于存储要排序数组,r[0]用作哨兵或临时变量*/
int length; /*用于记录顺序表的长度*/
}SqList;
/*交换L中数组r的下标为i和j的值*/
void swap(SqList *L ,int i,int j)
{
int temp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}
三、不同级别的冒泡排序
1、冒泡排序初级版
/*对顺序表L作交换排序*/
void BubbleSort0(SqList *L)
{
int i,j;
for(i=1;i<L->length;i++)
{
for(j=i+1;j<=L->length;j++)
{
if(L->r[i]>L->r[j])
swap(L,i,j); /*交换L->[i]与L->r[j]的值*/
}
}
}
说明:这个算法总是把此低的数据换到靠后的位置,算法效率非常低。
2、冒泡排序
/*对顺序表L作冒泡排序*/
void BubbleSort(SqList *L)
{
int i,j;
for(i=1;i<L->length;i++)
{
for(j=L->length-1;j>=i;j--) /*注意j是从后往前循环*/
{
if(L->r[j]>L->r[j+1]) /*若前者大于后者(注意这里与上一算法差异)*/
swap(L,j,j+1); /*交换L->r[j]和L->r[j+1]的值*/
}
}
}
说明:这个算法有一个缺点,当给出的整个顺序表已经是有序的,但是代码还是要一一比较
3、冒泡排序优化版
/*对顺序表L作改进冒泡算法*/
void BubbleSort2(SqList *L)
{
int i,j;
Status flag=TRUE; /*flag用来作为标记*/
for(i=1;i<L->length && flag;i++) /*若flag为false则退出循环*/
{
flag=FALSE; /*初始为false*/
for(j=L->length-1;j>=i;j--)
{
if(L->r[j]>L->r[j+1])
{
swap(L,j,j+1); /*交换L->r[j]与L->r[j+1]的值*/
/*在这个大循环中如果有数据循环false=true,若是没有,说明整个表已是有序的了,不需要再循环比较了*/
false=TRUE;
}
}
}
}
转载于:https://blog.51cto.com/xiaoahei/1229875