下面是未经改进的冒泡排序算法:
#include
#include
int a[10] = {1,4,3,5,23,2,45,6,3,5};
main()
{
int
i,j,mid;
int
length = 10;
//开始外圈循环
for(i=0;i<=9;i++)
//外圈循环到i时,说明该数组的后i-1个数已经排好序并且是最大值
for(j=0;j<9-i;j++) //注意循环条件,因为存在a[j+1],所以j不能到达最后
{
if(a[j]>=a[j+1])
{
mid
= a[j];
a[j]
= a[j+1];
a[j+1]
= mid;
}
}
for(i=0;i<=9;i++)
printf("%d ",a[i]);
system("pause");
}
在这个冒泡排序算法中有一个缺陷,如果数组是 2 1 3 4 5 6
,那么在第一次外圈结束后,该数组就已经完成排序,但是程序还是会继续循环下去,做很多无用的比较,但是根本不会出现数的位置的交换。所以我们需要考虑一下冒泡排序的结束条件。
下面给出一个定义:如果冒泡排序在一次外圈的内圈循环中没有出现数的位置的交换,那么该数组排序完成,不需要向下进行。解释一下这个定义,内圈的循环是从0~length-i-1的,不出现交换说明在这个范围内后一个数都大于前一个数,而在length-i-1至lenth的范围中,本来就是符合条件的,所以定义成立。
所以我们添加一个flag标志,观察在每次外圈时是否出现数值的交换。
#include
#include
int a[10] =
{1,4,3,5,23,2,45,6,3,5};
main()
{
int i,j,mid;
int length = 10;
int flag = 1;
//标识符
for(i=0;i<=9&&flag;i++)
//注意判定条件
for(j=0;j<9-i;j++)
{
flag=0; //每次外圈时初始化
if(a[j]>=a[j+1])
{
mid =
a[j];
a[j] =
a[j+1];
a[j+1] =
mid;
flag=1;
//如果有交换,那么可以进入下一圈循环
}
}
for(i=0;i<=9;i++)
printf("%d ",a[i]);
system("pause");
}
本来冒泡排序就不是一个节省时间的排序算法,这样也算做了一点小更新吧..