一、概念

冒泡排序(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
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
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
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; } } }}