#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,来实现冒泡排序的总次数。冒泡函数总运行次数为,数组内元素个数减去一个一。因为冒泡函数是以左边比上右边,若左边比右边大,不符合顺序,进行交换。依此逻辑,在交换到最后一次时,交换次数将会比总元素个数少一。

参考菜鸟教程上的动图

C语言实现冒泡循环算法(详细)_冒泡排序

每一次冒泡排序的检索次数

  • 其实和前者排序次数逻辑相似,也可以完全写的一样(换了变量),但是可以优化一下。在第一次排序时,必定会有两个或多个元素符合了顺序,那这些元素就不用在检索排序了,因此如果检索次数随排序次数递减,那就实现了优化。
  • 直接在条件判断中再减去排序次数的变量,如“f<c-1-e”。

交换逻辑

  • 在嵌套的for循环中,插入if判断,并按前者如果比后者大,进行判断执行。
  • 代码表示如上面代码

图形表示

C语言实现冒泡循环算法(详细)_数组_02

优化

  • 在第一次排序的时候如果发现没有任何元素需要交换,那么这个数组就是绝对的顺序。
  • 那就定义一个变量h,初始化值为1。在if判断中添加进去h=0。再进行if判断h变量的值,如果不需要排序,则break,跳出循环。
  • 来到最后一步,使用for循环依次输出以及排序好的数组。

C语言实现冒泡循环算法(详细)_冒泡排序_03

  • 没有错误

拓展

  • 数组名代表整个数组,但是在sizeof运算中,&取地址值为特殊情况