冒泡排序
介绍
冒泡排序由于其的排序过程酷似冒泡一样,故为冒泡排序
实现
冒泡排序的实现思想就是,相邻的两数交换,即反序的两两交换,一直到没有交换记录为止
排序
由于算法比较简单,就直接看吧
void BubbleSort_(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);
}
}
}
这里swap
是交换函数
如下
void swap(SqList *L,int i,int j)
{
int temp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}
显而易见这里的第一版冒泡是有问题的,比如在对类似{10,1,9,8,4,7,6,5,2},进行由小到大排序时,在DeBug时发现,将1和2交换到队首时会出现4被置换到了队尾,这样就意味着下一次排序时进行的步骤增加
冒泡排序
由以上就有
void BubbleSort(SqList *L)
{
int i,j;
for(i=1;i<L->length;i++)
{
for(j=L->length-1;j>=i;j--)
{
if(L->r[j]<L->r[j+1])
swap(L,j,j+1);
}
}
}
从队尾开始进行排序能避免这一问题,这样就诞生了真正的冒泡排序
冒泡排序改进
我们观察冒泡排序时发现,还是有改进空间的
例如在对{1,3,2,4,5,6,7,8,9,10}
,类似有一定顺序的数组进行排序时发现,现有的冒泡排序在进行到1,2,3
排列完毕后会出现继续执行的情况,按照一般的逻辑排好,1,2,3
以后就不需要继续进行冒泡排序了,基于这种情况就可以对其改进了
void BubbleSort_Pro(SqList *L)
{
int i,j;
int flag=TRUE;
for(i=1;i<L->length&&flag;i++)//flag为TRUE可以循环,否则终止循环
{
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;//有数据交换
}
}
}
}
其中TRUE为1,FALSE为1
改进的思想就是在原有基础上添加一个值来记录是否进行了数值交换,有则有返回值,没有就可以跳出循环不需要执行接下来的步骤
因为没有数值交换就意味着全数组已经排好了不需要交换了,这个时候就不需要继续执行了
以上就是冒泡排序的全部内容