c语言 冒泡排序算法,排序算法_冒泡排序改进(c语言实现)

下面是未经改进的冒泡排序算法:

#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");

}

本来冒泡排序就不是一个节省时间的排序算法,这样也算做了一点小更新吧..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值