#include <stdio.h>
void bubble_sort (int a[],int c)
{
int e=0;
for (e=0;e<c-1;e+=1)
{
int h=1;
int f=0;
for(f=0;f<c-1-e;f+=1)
{
if (a[f]>a[f+1])
{
int g=a[f];
a[f]=a[f+1];
a[f+1]=g;
h=0;
}
}
if (h==1)
{
break;
}
}
}
int main ()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
int c=0 ;
c=sizeof(a)/sizeof(a[0]);
bubble_sort(a,c);
int d=0;
for (d=0;d<c;d++)
{
printf("%d\n",a[d]);
}
return 0;
}
- 从主函数main中开始解析。定义一个数组a,并且以非顺序的排列添加元素至数组中。此时以完全颠倒的顺序添加了整数零到九元素至数组a中。
- 首先,计算数组的元素个数,这里是使用的是计算的方法。并且推荐一般的程序使用这种方法,有时给数组个数直接的常量会导致在程序设计中,思维混乱。
- 求出元素个数之后呢,把视线放回到声明处,使用void简单定义一个自定义的函数,关于函数定义之后细讲,现在主要讲算法。
- 并且在函数中定义了整形数组a,以及整形变量c
- 再将视线放回到主函数中。使用定义好自定义函数bubble_sort,并且向函数内传参。(就是将值给予函数内部的相同变量使用)
注意
- 此处传参的数组a仅仅只能传过去第一个下表0代表的元素的内存地址。所以计算元素个数的代码只能在自定义函数之外的地方进行,然后传入。(不然就会出现数组总内存大小除以数组第一个元素内存大小,相同的数字相除,结果恒为1。)
冒泡排序次数
- 定义一个整形变量e,来实现冒泡排序的总次数。冒泡函数总运行次数为,数组内元素个数减去一个一。因为冒泡函数是以左边比上右边,若左边比右边大,不符合顺序,进行交换。依此逻辑,在交换到最后一次时,交换次数将会比总元素个数少一。
参考菜鸟教程上的动图
每一次冒泡排序的检索次数
- 其实和前者排序次数逻辑相似,也可以完全写的一样(换了变量),但是可以优化一下。在第一次排序时,必定会有两个或多个元素符合了顺序,那这些元素就不用在检索排序了,因此如果检索次数随排序次数递减,那就实现了优化。
- 直接在条件判断中再减去排序次数的变量,如“f<c-1-e”。
交换逻辑
- 在嵌套的for循环中,插入if判断,并按前者如果比后者大,进行判断执行。
- 代码表示如上面代码
图形表示
优化
- 在第一次排序的时候如果发现没有任何元素需要交换,那么这个数组就是绝对的顺序。
- 那就定义一个变量h,初始化值为1。在if判断中添加进去h=0。再进行if判断h变量的值,如果不需要排序,则break,跳出循环。
- 来到最后一步,使用for循环依次输出以及排序好的数组。
- 没有错误
拓展
- 数组名代表整个数组,但是在sizeof运算中,&取地址值为特殊情况