1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > c语言 冒泡排序算法 排序算法_冒泡排序改进(c语言实现)

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

时间:2022-08-19 14:57:11

相关推荐

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

}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。