一、概念
冒泡排序(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;ilength;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;ilength;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;ilength && 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; } } }}