C语言排序方法-----冒泡排序法

关于冒泡排序百度百科是这样定义的:
在这里插入图片描述
算法原理为:
在这里插入图片描述
下面直接看C语言代码的实现

//打印数组元素
void printf_nums( int num[], int count )
{
    int i = 0;
    for( i = 0; i < count; i++ )
    {
        printf( "%d ", num[i] );
    }
    printf( "\r\n" );
}
void swap( int* a, int* b )
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}
void bubbleSort( int num[], int count )
{
    int cnt = 0;

    printf( "原始数组:" );
    printf_nums( num, count );

    for( int i = 0; i < count - 1; i++ )
    {
        for( int j = 0; j < count - i - 1; j++ )
        {
            if( num[j] > num[j + 1] )
            {
                swap( &num[j], &num[j + 1] );                   //通过函数交换两个值
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
    }
}

直接比较数组相邻的两个元素,如果前一个数字比后一个大,就交换两个数字位置。
下面看运行结果
原始数组:9 8 7 6 5 4 3 2 1 0
第 0趟 : 8 9 7 6 5 4 3 2 1 0
第 1趟 : 8 7 9 6 5 4 3 2 1 0
第 2趟 : 8 7 6 9 5 4 3 2 1 0
第 3趟 : 8 7 6 5 9 4 3 2 1 0
第 4趟 : 8 7 6 5 4 9 3 2 1 0
第 5趟 : 8 7 6 5 4 3 9 2 1 0
第 6趟 : 8 7 6 5 4 3 2 9 1 0
第 7趟 : 8 7 6 5 4 3 2 1 9 0
第 8趟 : 8 7 6 5 4 3 2 1 0 9
第 9趟 : 7 8 6 5 4 3 2 1 0 9
第 10趟 : 7 6 8 5 4 3 2 1 0 9
第 11趟 : 7 6 5 8 4 3 2 1 0 9
第 12趟 : 7 6 5 4 8 3 2 1 0 9
第 13趟 : 7 6 5 4 3 8 2 1 0 9
第 14趟 : 7 6 5 4 3 2 8 1 0 9
第 15趟 : 7 6 5 4 3 2 1 8 0 9
第 16趟 : 7 6 5 4 3 2 1 0 8 9
第 17趟 : 6 7 5 4 3 2 1 0 8 9
第 18趟 : 6 5 7 4 3 2 1 0 8 9
第 19趟 : 6 5 4 7 3 2 1 0 8 9
第 20趟 : 6 5 4 3 7 2 1 0 8 9
第 21趟 : 6 5 4 3 2 7 1 0 8 9
第 22趟 : 6 5 4 3 2 1 7 0 8 9
第 23趟 : 6 5 4 3 2 1 0 7 8 9
第 24趟 : 5 6 4 3 2 1 0 7 8 9
第 25趟 : 5 4 6 3 2 1 0 7 8 9
第 26趟 : 5 4 3 6 2 1 0 7 8 9
第 27趟 : 5 4 3 2 6 1 0 7 8 9
第 28趟 : 5 4 3 2 1 6 0 7 8 9
第 29趟 : 5 4 3 2 1 0 6 7 8 9
第 30趟 : 4 5 3 2 1 0 6 7 8 9
第 31趟 : 4 3 5 2 1 0 6 7 8 9
第 32趟 : 4 3 2 5 1 0 6 7 8 9
第 33趟 : 4 3 2 1 5 0 6 7 8 9
第 34趟 : 4 3 2 1 0 5 6 7 8 9
第 35趟 : 3 4 2 1 0 5 6 7 8 9
第 36趟 : 3 2 4 1 0 5 6 7 8 9
第 37趟 : 3 2 1 4 0 5 6 7 8 9
第 38趟 : 3 2 1 0 4 5 6 7 8 9
第 39趟 : 2 3 1 0 4 5 6 7 8 9
第 40趟 : 2 1 3 0 4 5 6 7 8 9
第 41趟 : 2 1 0 3 4 5 6 7 8 9
第 42趟 : 1 2 0 3 4 5 6 7 8 9
第 43趟 : 1 0 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

在这里插入图片描述
通过串口输出的数据可以明显看到,原始数组的数据是 9 8 7 6 5 4 3 2 1 0 是从大到小排列的,现在要从小到大排序,那么从第一个数字开始,依次和后面的数据比较,将最大的数字9移动到数组最后一位,然后将第二大的数字8移动到数组倒数第二位,依次类推,直到所有数据都比较完成。
下面换一组数据测试
原始数组:0 8 1 5 4 3 7 9 2 6
第 0趟 : 0 8 1 5 4 3 7 9 2 6
第 1趟 : 0 1 8 5 4 3 7 9 2 6
第 2趟 : 0 1 5 8 4 3 7 9 2 6
第 3趟 : 0 1 5 4 8 3 7 9 2 6
第 4趟 : 0 1 5 4 3 8 7 9 2 6
第 5趟 : 0 1 5 4 3 7 8 9 2 6
第 6趟 : 0 1 5 4 3 7 8 9 2 6
第 7趟 : 0 1 5 4 3 7 8 2 9 6
第 8趟 : 0 1 5 4 3 7 8 2 6 9
第 9趟 : 0 1 5 4 3 7 8 2 6 9
第 10趟 : 0 1 5 4 3 7 8 2 6 9
第 11趟 : 0 1 4 5 3 7 8 2 6 9
第 12趟 : 0 1 4 3 5 7 8 2 6 9
第 13趟 : 0 1 4 3 5 7 8 2 6 9
第 14趟 : 0 1 4 3 5 7 8 2 6 9
第 15趟 : 0 1 4 3 5 7 2 8 6 9
第 16趟 : 0 1 4 3 5 7 2 6 8 9
第 17趟 : 0 1 4 3 5 7 2 6 8 9
第 18趟 : 0 1 4 3 5 7 2 6 8 9
第 19趟 : 0 1 3 4 5 7 2 6 8 9
第 20趟 : 0 1 3 4 5 7 2 6 8 9
第 21趟 : 0 1 3 4 5 7 2 6 8 9
第 22趟 : 0 1 3 4 5 2 7 6 8 9
第 23趟 : 0 1 3 4 5 2 6 7 8 9
第 24趟 : 0 1 3 4 5 2 6 7 8 9
第 25趟 : 0 1 3 4 5 2 6 7 8 9
第 26趟 : 0 1 3 4 5 2 6 7 8 9
第 27趟 : 0 1 3 4 5 2 6 7 8 9
第 28趟 : 0 1 3 4 2 5 6 7 8 9
第 29趟 : 0 1 3 4 2 5 6 7 8 9
第 30趟 : 0 1 3 4 2 5 6 7 8 9
第 31趟 : 0 1 3 4 2 5 6 7 8 9
第 32趟 : 0 1 3 4 2 5 6 7 8 9
第 33趟 : 0 1 3 2 4 5 6 7 8 9
第 34趟 : 0 1 3 2 4 5 6 7 8 9
第 35趟 : 0 1 3 2 4 5 6 7 8 9
第 36趟 : 0 1 3 2 4 5 6 7 8 9
第 37趟 : 0 1 2 3 4 5 6 7 8 9
第 38趟 : 0 1 2 3 4 5 6 7 8 9
第 39趟 : 0 1 2 3 4 5 6 7 8 9
第 40趟 : 0 1 2 3 4 5 6 7 8 9
第 41趟 : 0 1 2 3 4 5 6 7 8 9
第 42趟 : 0 1 2 3 4 5 6 7 8 9
第 43趟 : 0 1 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

在这里插入图片描述
这次将原始数据变为0 8 1 5 4 3 7 9 2 6 ,首先将0和8比较,0<8,不交换位置,然后在比较8和1,8>1,所以8和1交换位置,下来再比较8和5,这样8就被依次移动到后面去了,当8遇到9时,8<9,所以8和9交换位置,下来将9和后面的数据开始比较,8的位置就暂时不移动了,下来开始移动9的位置。直到将9移动到数组最后一位。下来开始比较时,5一直向后移动,直到遇到比它大的数字7,然后开始又开始移动7,当7遇到了比它大的8时,又开始移动8,由于最大的数字9已经被移动到了最后一位,这样8移动到9前面时,不能和9交换位置,所以8就被放在了数组倒数第二位。
这样每次一个循环下来,都会找到未排序的数字中最大的一个,然后将它移动到对应的位置。

这种冒泡排序法,每次都要将前一个数字和后一个数字进行比较,就算后面的数字比它大,也要进行一次比较。通过上面可以发现,只要进行一轮之后,最大的数字就会被找出来,最大数字就会被放大数组最后一位,那么第二轮比较的时候就可以比较到数组的倒数第二位就行了,最后一位可以不用比较了。那么可以将程序进行优化。
设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。
由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

void bubbleSort_1( int num[], int count )
{
    int cnt = 0;
    int i = count - 1; //初始时,最后位置保持不变

    printf( "原始数组:" );
    printf_nums( num, count );

    while( i > 0 )
    {
        int pos = 0; //每趟开始时,无记录交换
        for( int j = 0; j < i; j++ )
        {
            if( num[j] > num[j + 1] )
            {
                pos = j; //记录交换的位置
                swap( &num[j], &num[j + 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
        i = pos; //为下一趟排序作准备
    }
}

下来测试一次:
原始数组:9 8 7 6 5 4 3 2 1 0
第 0趟 : 8 9 7 6 5 4 3 2 1 0
第 1趟 : 8 7 9 6 5 4 3 2 1 0
第 2趟 : 8 7 6 9 5 4 3 2 1 0
第 3趟 : 8 7 6 5 9 4 3 2 1 0
第 4趟 : 8 7 6 5 4 9 3 2 1 0
第 5趟 : 8 7 6 5 4 3 9 2 1 0
第 6趟 : 8 7 6 5 4 3 2 9 1 0
第 7趟 : 8 7 6 5 4 3 2 1 9 0
第 8趟 : 8 7 6 5 4 3 2 1 0 9
第 9趟 : 7 8 6 5 4 3 2 1 0 9
第 10趟 : 7 6 8 5 4 3 2 1 0 9
第 11趟 : 7 6 5 8 4 3 2 1 0 9
第 12趟 : 7 6 5 4 8 3 2 1 0 9
第 13趟 : 7 6 5 4 3 8 2 1 0 9
第 14趟 : 7 6 5 4 3 2 8 1 0 9
第 15趟 : 7 6 5 4 3 2 1 8 0 9
第 16趟 : 7 6 5 4 3 2 1 0 8 9
第 17趟 : 6 7 5 4 3 2 1 0 8 9
第 18趟 : 6 5 7 4 3 2 1 0 8 9
第 19趟 : 6 5 4 7 3 2 1 0 8 9
第 20趟 : 6 5 4 3 7 2 1 0 8 9
第 21趟 : 6 5 4 3 2 7 1 0 8 9
第 22趟 : 6 5 4 3 2 1 7 0 8 9
第 23趟 : 6 5 4 3 2 1 0 7 8 9
第 24趟 : 5 6 4 3 2 1 0 7 8 9
第 25趟 : 5 4 6 3 2 1 0 7 8 9
第 26趟 : 5 4 3 6 2 1 0 7 8 9
第 27趟 : 5 4 3 2 6 1 0 7 8 9
第 28趟 : 5 4 3 2 1 6 0 7 8 9
第 29趟 : 5 4 3 2 1 0 6 7 8 9
第 30趟 : 4 5 3 2 1 0 6 7 8 9
第 31趟 : 4 3 5 2 1 0 6 7 8 9
第 32趟 : 4 3 2 5 1 0 6 7 8 9
第 33趟 : 4 3 2 1 5 0 6 7 8 9
第 34趟 : 4 3 2 1 0 5 6 7 8 9
第 35趟 : 3 4 2 1 0 5 6 7 8 9
第 36趟 : 3 2 4 1 0 5 6 7 8 9
第 37趟 : 3 2 1 4 0 5 6 7 8 9
第 38趟 : 3 2 1 0 4 5 6 7 8 9
第 39趟 : 2 3 1 0 4 5 6 7 8 9
第 40趟 : 2 1 3 0 4 5 6 7 8 9
第 41趟 : 2 1 0 3 4 5 6 7 8 9
第 42趟 : 1 2 0 3 4 5 6 7 8 9
第 43趟 : 1 0 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

测试结果好像没啥变化,因为这次测试数据是9 8 7 6 5 4 3 2 1 0 ,是排序的最坏结果,那么如果数组中的数据不是最坏排序结果,会不会有变化。下来再测试一次。

原始数组:0 8 1 5 4 3 7 9 2 6
第 0趟 : 0 8 1 5 4 3 7 9 2 6
第 1趟 : 0 1 8 5 4 3 7 9 2 6
第 2趟 : 0 1 5 8 4 3 7 9 2 6
第 3趟 : 0 1 5 4 8 3 7 9 2 6
第 4趟 : 0 1 5 4 3 8 7 9 2 6
第 5趟 : 0 1 5 4 3 7 8 9 2 6
第 6趟 : 0 1 5 4 3 7 8 9 2 6
第 7趟 : 0 1 5 4 3 7 8 2 9 6
第 8趟 : 0 1 5 4 3 7 8 2 6 9
第 9趟 : 0 1 5 4 3 7 8 2 6 9
第 10趟 : 0 1 5 4 3 7 8 2 6 9
第 11趟 : 0 1 4 5 3 7 8 2 6 9
第 12趟 : 0 1 4 3 5 7 8 2 6 9
第 13趟 : 0 1 4 3 5 7 8 2 6 9
第 14趟 : 0 1 4 3 5 7 8 2 6 9
第 15趟 : 0 1 4 3 5 7 2 8 6 9
第 16趟 : 0 1 4 3 5 7 2 6 8 9
第 17趟 : 0 1 4 3 5 7 2 6 8 9
第 18趟 : 0 1 4 3 5 7 2 6 8 9
第 19趟 : 0 1 3 4 5 7 2 6 8 9
第 20趟 : 0 1 3 4 5 7 2 6 8 9
第 21趟 : 0 1 3 4 5 7 2 6 8 9
第 22趟 : 0 1 3 4 5 2 7 6 8 9
第 23趟 : 0 1 3 4 5 2 6 7 8 9
第 24趟 : 0 1 3 4 5 2 6 7 8 9
第 25趟 : 0 1 3 4 5 2 6 7 8 9
第 26趟 : 0 1 3 4 5 2 6 7 8 9
第 27趟 : 0 1 3 4 5 2 6 7 8 9
第 28趟 : 0 1 3 4 2 5 6 7 8 9
第 29趟 : 0 1 3 4 2 5 6 7 8 9
第 30趟 : 0 1 3 4 2 5 6 7 8 9
第 31趟 : 0 1 3 4 2 5 6 7 8 9
第 32趟 : 0 1 3 4 2 5 6 7 8 9
第 33趟 : 0 1 3 2 4 5 6 7 8 9
第 34趟 : 0 1 3 2 4 5 6 7 8 9
第 35趟 : 0 1 3 2 4 5 6 7 8 9
第 36趟 : 0 1 2 3 4 5 6 7 8 9
第 37趟 : 0 1 2 3 4 5 6 7 8 9
第 38趟 : 0 1 2 3 4 5 6 7 8 9

这次用了38趟就比较完成,比最坏情况下少了6次,说明算法的优化还是有效果的。
那么能不能在优化一下算法,在上面两种情况下,每次都只能找出一个最大数进行排序,那可不可以考虑在比较的过程中依次找到最大值和最小值,一个向前冒泡,一个向后冒泡呢?
再一次优化算法

void bubbleSort_2( int num[], int count )
{
    int low = 0;
    int high = count - 1; //设置变量的初始值
    int  j;
    int cnt = 0;
    printf( "原始数组:" );
    printf_nums( num, count );
    while( low < high )
    {
        for( j = low; j < high; ++j ) //正向冒泡,找到最大者
        {
            if( num[j] > num[j + 1] )
            {
                swap( &num[j], &num[j + 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
        --high;  //修改high值, 前移一位
        for( j = high; j > low; --j ) //反向冒泡,找到最小者
        {
            if( num[j] < num[j - 1] )
            {
                swap( &num[j], &num[j - 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
        ++low;  //修改low值,后移一位
    }
}

先测试一下最坏情况下排序

原始数组:9 8 7 6 5 4 3 2 1 0
第 0趟 : 8 9 7 6 5 4 3 2 1 0
第 1趟 : 8 7 9 6 5 4 3 2 1 0
第 2趟 : 8 7 6 9 5 4 3 2 1 0
第 3趟 : 8 7 6 5 9 4 3 2 1 0
第 4趟 : 8 7 6 5 4 9 3 2 1 0
第 5趟 : 8 7 6 5 4 3 9 2 1 0
第 6趟 : 8 7 6 5 4 3 2 9 1 0
第 7趟 : 8 7 6 5 4 3 2 1 9 0
第 8趟 : 8 7 6 5 4 3 2 1 0 9
第 9趟 : 8 7 6 5 4 3 2 0 1 9
第 10趟 : 8 7 6 5 4 3 0 2 1 9
第 11趟 : 8 7 6 5 4 0 3 2 1 9
第 12趟 : 8 7 6 5 0 4 3 2 1 9
第 13趟 : 8 7 6 0 5 4 3 2 1 9
第 14趟 : 8 7 0 6 5 4 3 2 1 9
第 15趟 : 8 0 7 6 5 4 3 2 1 9
第 16趟 : 0 8 7 6 5 4 3 2 1 9
第 17趟 : 0 7 8 6 5 4 3 2 1 9
第 18趟 : 0 7 6 8 5 4 3 2 1 9
第 19趟 : 0 7 6 5 8 4 3 2 1 9
第 20趟 : 0 7 6 5 4 8 3 2 1 9
第 21趟 : 0 7 6 5 4 3 8 2 1 9
第 22趟 : 0 7 6 5 4 3 2 8 1 9
第 23趟 : 0 7 6 5 4 3 2 1 8 9
第 24趟 : 0 7 6 5 4 3 1 2 8 9
第 25趟 : 0 7 6 5 4 1 3 2 8 9
第 26趟 : 0 7 6 5 1 4 3 2 8 9
第 27趟 : 0 7 6 1 5 4 3 2 8 9
第 28趟 : 0 7 1 6 5 4 3 2 8 9
第 29趟 : 0 1 7 6 5 4 3 2 8 9
第 30趟 : 0 1 6 7 5 4 3 2 8 9
第 31趟 : 0 1 6 5 7 4 3 2 8 9
第 32趟 : 0 1 6 5 4 7 3 2 8 9
第 33趟 : 0 1 6 5 4 3 7 2 8 9
第 34趟 : 0 1 6 5 4 3 2 7 8 9
第 35趟 : 0 1 6 5 4 2 3 7 8 9
第 36趟 : 0 1 6 5 2 4 3 7 8 9
第 37趟 : 0 1 6 2 5 4 3 7 8 9
第 38趟 : 0 1 2 6 5 4 3 7 8 9
第 39趟 : 0 1 2 5 6 4 3 7 8 9
第 40趟 : 0 1 2 5 4 6 3 7 8 9
第 41趟 : 0 1 2 5 4 3 6 7 8 9
第 42趟 : 0 1 2 5 3 4 6 7 8 9
第 43趟 : 0 1 2 3 5 4 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

通过结果来看,最坏情况下没什么变化,那么在用常规数组测试一次
原始数组:0 8 1 5 4 3 7 9 2 6
第 0趟 : 0 8 1 5 4 3 7 9 2 6
第 1趟 : 0 1 8 5 4 3 7 9 2 6
第 2趟 : 0 1 5 8 4 3 7 9 2 6
第 3趟 : 0 1 5 4 8 3 7 9 2 6
第 4趟 : 0 1 5 4 3 8 7 9 2 6
第 5趟 : 0 1 5 4 3 7 8 9 2 6
第 6趟 : 0 1 5 4 3 7 8 9 2 6
第 7趟 : 0 1 5 4 3 7 8 2 9 6
第 8趟 : 0 1 5 4 3 7 8 2 6 9
第 9趟 : 0 1 5 4 3 7 8 2 6 9
第 10趟 : 0 1 5 4 3 7 2 8 6 9
第 11趟 : 0 1 5 4 3 2 7 8 6 9
第 12趟 : 0 1 5 4 2 3 7 8 6 9
第 13趟 : 0 1 5 2 4 3 7 8 6 9
第 14趟 : 0 1 2 5 4 3 7 8 6 9
第 15趟 : 0 1 2 5 4 3 7 8 6 9
第 16趟 : 0 1 2 5 4 3 7 8 6 9
第 17趟 : 0 1 2 5 4 3 7 8 6 9
第 18趟 : 0 1 2 5 4 3 7 8 6 9
第 19趟 : 0 1 2 4 5 3 7 8 6 9
第 20趟 : 0 1 2 4 3 5 7 8 6 9
第 21趟 : 0 1 2 4 3 5 7 8 6 9
第 22趟 : 0 1 2 4 3 5 7 8 6 9
第 23趟 : 0 1 2 4 3 5 7 6 8 9
第 24趟 : 0 1 2 4 3 5 6 7 8 9
第 25趟 : 0 1 2 4 3 5 6 7 8 9
第 26趟 : 0 1 2 4 3 5 6 7 8 9
第 27趟 : 0 1 2 3 4 5 6 7 8 9
第 28趟 : 0 1 2 3 4 5 6 7 8 9
第 29趟 : 0 1 2 3 4 5 6 7 8 9
第 30趟 : 0 1 2 3 4 5 6 7 8 9
第 31趟 : 0 1 2 3 4 5 6 7 8 9
第 32趟 : 0 1 2 3 4 5 6 7 8 9
第 33趟 : 0 1 2 3 4 5 6 7 8 9
第 34趟 : 0 1 2 3 4 5 6 7 8 9
第 35趟 : 0 1 2 3 4 5 6 7 8 9
第 36趟 : 0 1 2 3 4 5 6 7 8 9
第 37趟 : 0 1 2 3 4 5 6 7 8 9
第 38趟 : 0 1 2 3 4 5 6 7 8 9
第 39趟 : 0 1 2 3 4 5 6 7 8 9
第 40趟 : 0 1 2 3 4 5 6 7 8 9
第 41趟 : 0 1 2 3 4 5 6 7 8 9
第 42趟 : 0 1 2 3 4 5 6 7 8 9
第 43趟 : 0 1 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

通过测试结果可以看出,优化代码后的效率没有发生变化。虽然在第27趟已经排序完成,但是比较的趟数依然没有减少。
那能不能把上面两种算法结合起来,每次找最大数和最小数的同时,将最大数和最小数的位置记录下来,这样就逐渐缩小排序范围。
优化后的算法如下:

void bubbleSort_3( int num[], int count )
{
    int low = 0;
    int high = count - 1; //设置变量的初始值
    int  j;
    int cnt = 0;
	int max = 0,min = 0;

   
    printf( "原始数组:" );
    printf_nums( num, count );
    while( low < high )
    {
        for( j = low; j < high; ++j ) //正向冒泡,找到最大者
        {
            if( num[j] > num[j + 1] )
            {
				max = j;
                swap( &num[j], &num[j + 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
		if(max < high)
		{
		  high = max;
		}
		else
		{
			--high;  //修改high值, 前移一位
		}
        for( j = high; j > low; --j ) //反向冒泡,找到最小者
        {
            if( num[j] < num[j - 1] )
            {
				min = j;
                swap( &num[j], &num[j - 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
		if(min > low)
		{
		  low = min;
		}
		else
		{
			++low;  //修改low值,后移一位
		}
    }
}

正向冒泡时通过max存储最大值最后一次交换的位置,如果发现最后一次交换的位置比当前循环中最大值下标还要靠前的话,说明最后一次交换位置后面的数据已经排序完成了,直接将当前循环的最大值下标跳到最后一次交换数据的位置。
同理反向冒泡时,发现当前循环中最小值的索引比最后一次最小值交换的位置还靠后的时候,直接将循环中最小值的索引跳到最后一次最小值交换的的位置处。
这样每次比较的范围会逐渐缩小。减少了排序次数。下面看一下排序结果

原始数组:0 8 1 5 4 3 7 9 2 6
第 0趟 : 0 8 1 5 4 3 7 9 2 6
第 1趟 : 0 1 8 5 4 3 7 9 2 6
第 2趟 : 0 1 5 8 4 3 7 9 2 6
第 3趟 : 0 1 5 4 8 3 7 9 2 6
第 4趟 : 0 1 5 4 3 8 7 9 2 6
第 5趟 : 0 1 5 4 3 7 8 9 2 6
第 6趟 : 0 1 5 4 3 7 8 9 2 6
第 7趟 : 0 1 5 4 3 7 8 2 9 6
第 8趟 : 0 1 5 4 3 7 8 2 6 9
第 9趟 : 0 1 5 4 3 7 8 2 6 9
第 10趟 : 0 1 5 4 3 7 2 8 6 9
第 11趟 : 0 1 5 4 3 2 7 8 6 9
第 12趟 : 0 1 5 4 2 3 7 8 6 9
第 13趟 : 0 1 5 2 4 3 7 8 6 9
第 14趟 : 0 1 2 5 4 3 7 8 6 9
第 15趟 : 0 1 2 5 4 3 7 8 6 9
第 16趟 : 0 1 2 5 4 3 7 8 6 9
第 17趟 : 0 1 2 4 5 3 7 8 6 9
第 18趟 : 0 1 2 4 3 5 7 8 6 9
第 19趟 : 0 1 2 4 3 5 7 8 6 9
第 20趟 : 0 1 2 4 3 5 7 8 6 9
第 21趟 : 0 1 2 4 3 5 7 6 8 9
第 22趟 : 0 1 2 4 3 5 6 7 8 9
第 23趟 : 0 1 2 4 3 5 6 7 8 9
第 24趟 : 0 1 2 4 3 5 6 7 8 9
第 25趟 : 0 1 2 3 4 5 6 7 8 9
第 26趟 : 0 1 2 3 4 5 6 7 8 9
第 27趟 : 0 1 2 3 4 5 6 7 8 9
第 28趟 : 0 1 2 3 4 5 6 7 8 9
第 29趟 : 0 1 2 3 4 5 6 7 8 9
第 30趟 : 0 1 2 3 4 5 6 7 8 9
第 31趟 : 0 1 2 3 4 5 6 7 8 9

这次比较趟数明显减小了很多,说明优化后的排序效率更高了。
下来将这几种方法放一起比较看看效果:

//打印数组元素
void printf_nums( int num[], int count )
{
    int i = 0;
    for( i = 0; i < count; i++ )
    {
        printf( "%d ", num[i] );
    }
    printf( "\r\n" );
}
void swap( int* a, int* b )
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}
void bubbleSort( int num[], int count )
{
    int cnt = 0;
	int i = 0,j = 0;

    printf( "原始数组:" );
    printf_nums( num, count );

    for( i = 0; i < count - 1; i++ )
    {
        for(  j = 0; j < count - i - 1; j++ )
        {
            if( num[j] > num[j + 1] )
            {
                swap( &num[j], &num[j + 1] );                   //通过函数交换两个值
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
    }
}

void bubbleSort_1( int num[], int count )
{
    int cnt = 0;
    int i = count - 1; //初始时,最后位置保持不变
	int j = 0;

    printf( "原始数组:" );
    printf_nums( num, count );

    while( i > 0 )
    {
        int pos = 0; //每趟开始时,无记录交换
        for( j = 0; j < i; j++ )
        {
            if( num[j] > num[j + 1] )
            {
                pos = j; //记录交换的位置
                swap( &num[j], &num[j + 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
        i = pos; //为下一趟排序作准备
    }
}

void bubbleSort_2( int num[], int count )
{
    int low = 0;
    int high = count - 1; //设置变量的初始值
    int  j;
    int cnt = 0;
    printf( "原始数组:" );
    printf_nums( num, count );
    while( low < high )
    {
        for( j = low; j < high; ++j ) //正向冒泡,找到最大者
        {
            if( num[j] > num[j + 1] )
            {
                swap( &num[j], &num[j + 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
        --high;  //修改high值, 前移一位
        for( j = high; j > low; --j ) //反向冒泡,找到最小者
        {
            if( num[j] < num[j - 1] )
            {
                swap( &num[j], &num[j - 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
        ++low;  //修改low值,后移一位
    }
}

void bubbleSort_3( int num[], int count )
{
    int low = 0;
    int high = count - 1; //设置变量的初始值
    int  j;
    int cnt = 0;
	int max = 0,min = 0;
   
    printf( "原始数组:" );
    printf_nums( num, count );
    while( low < high )
    {
        for( j = low; j < high; ++j ) //正向冒泡,找到最大者
        {
            if( num[j] > num[j + 1] )
            {
				max = j;
                swap( &num[j], &num[j + 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
		if(max<high)
		{
		  high = max;
		}
		else
		{
			--high;  //修改high值, 前移一位
		}
        for( j = high; j > low; --j ) //反向冒泡,找到最小者
        {
            if( num[j] < num[j - 1] )
            {
				min = j;
                swap( &num[j], &num[j - 1] );
            }
            printf( "第%3d趟 : ", cnt++ );
            printf_nums( num, count );
        }
		if(min>low)
		{
		  low = min;
		}
		else
		{
			++low;  //修改low值,后移一位
		}
    }
}

bubbleSort test!
原始数组:9 8 7 6 5 4 3 2 1 0
第 0趟 : 8 9 7 6 5 4 3 2 1 0
第 1趟 : 8 7 9 6 5 4 3 2 1 0
第 2趟 : 8 7 6 9 5 4 3 2 1 0
第 3趟 : 8 7 6 5 9 4 3 2 1 0
第 4趟 : 8 7 6 5 4 9 3 2 1 0
第 5趟 : 8 7 6 5 4 3 9 2 1 0
第 6趟 : 8 7 6 5 4 3 2 9 1 0
第 7趟 : 8 7 6 5 4 3 2 1 9 0
第 8趟 : 8 7 6 5 4 3 2 1 0 9
第 9趟 : 7 8 6 5 4 3 2 1 0 9
第 10趟 : 7 6 8 5 4 3 2 1 0 9
第 11趟 : 7 6 5 8 4 3 2 1 0 9
第 12趟 : 7 6 5 4 8 3 2 1 0 9
第 13趟 : 7 6 5 4 3 8 2 1 0 9
第 14趟 : 7 6 5 4 3 2 8 1 0 9
第 15趟 : 7 6 5 4 3 2 1 8 0 9
第 16趟 : 7 6 5 4 3 2 1 0 8 9
第 17趟 : 6 7 5 4 3 2 1 0 8 9
第 18趟 : 6 5 7 4 3 2 1 0 8 9
第 19趟 : 6 5 4 7 3 2 1 0 8 9
第 20趟 : 6 5 4 3 7 2 1 0 8 9
第 21趟 : 6 5 4 3 2 7 1 0 8 9
第 22趟 : 6 5 4 3 2 1 7 0 8 9
第 23趟 : 6 5 4 3 2 1 0 7 8 9
第 24趟 : 5 6 4 3 2 1 0 7 8 9
第 25趟 : 5 4 6 3 2 1 0 7 8 9
第 26趟 : 5 4 3 6 2 1 0 7 8 9
第 27趟 : 5 4 3 2 6 1 0 7 8 9
第 28趟 : 5 4 3 2 1 6 0 7 8 9
第 29趟 : 5 4 3 2 1 0 6 7 8 9
第 30趟 : 4 5 3 2 1 0 6 7 8 9
第 31趟 : 4 3 5 2 1 0 6 7 8 9
第 32趟 : 4 3 2 5 1 0 6 7 8 9
第 33趟 : 4 3 2 1 5 0 6 7 8 9
第 34趟 : 4 3 2 1 0 5 6 7 8 9
第 35趟 : 3 4 2 1 0 5 6 7 8 9
第 36趟 : 3 2 4 1 0 5 6 7 8 9
第 37趟 : 3 2 1 4 0 5 6 7 8 9
第 38趟 : 3 2 1 0 4 5 6 7 8 9
第 39趟 : 2 3 1 0 4 5 6 7 8 9
第 40趟 : 2 1 3 0 4 5 6 7 8 9
第 41趟 : 2 1 0 3 4 5 6 7 8 9
第 42趟 : 1 2 0 3 4 5 6 7 8 9
第 43趟 : 1 0 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

bubbleSort_1 test!
原始数组:9 8 7 6 5 4 3 2 1 0
第 0趟 : 8 9 7 6 5 4 3 2 1 0
第 1趟 : 8 7 9 6 5 4 3 2 1 0
第 2趟 : 8 7 6 9 5 4 3 2 1 0
第 3趟 : 8 7 6 5 9 4 3 2 1 0
第 4趟 : 8 7 6 5 4 9 3 2 1 0
第 5趟 : 8 7 6 5 4 3 9 2 1 0
第 6趟 : 8 7 6 5 4 3 2 9 1 0
第 7趟 : 8 7 6 5 4 3 2 1 9 0
第 8趟 : 8 7 6 5 4 3 2 1 0 9
第 9趟 : 7 8 6 5 4 3 2 1 0 9
第 10趟 : 7 6 8 5 4 3 2 1 0 9
第 11趟 : 7 6 5 8 4 3 2 1 0 9
第 12趟 : 7 6 5 4 8 3 2 1 0 9
第 13趟 : 7 6 5 4 3 8 2 1 0 9
第 14趟 : 7 6 5 4 3 2 8 1 0 9
第 15趟 : 7 6 5 4 3 2 1 8 0 9
第 16趟 : 7 6 5 4 3 2 1 0 8 9
第 17趟 : 6 7 5 4 3 2 1 0 8 9
第 18趟 : 6 5 7 4 3 2 1 0 8 9
第 19趟 : 6 5 4 7 3 2 1 0 8 9
第 20趟 : 6 5 4 3 7 2 1 0 8 9
第 21趟 : 6 5 4 3 2 7 1 0 8 9
第 22趟 : 6 5 4 3 2 1 7 0 8 9
第 23趟 : 6 5 4 3 2 1 0 7 8 9
第 24趟 : 5 6 4 3 2 1 0 7 8 9
第 25趟 : 5 4 6 3 2 1 0 7 8 9
第 26趟 : 5 4 3 6 2 1 0 7 8 9
第 27趟 : 5 4 3 2 6 1 0 7 8 9
第 28趟 : 5 4 3 2 1 6 0 7 8 9
第 29趟 : 5 4 3 2 1 0 6 7 8 9
第 30趟 : 4 5 3 2 1 0 6 7 8 9
第 31趟 : 4 3 5 2 1 0 6 7 8 9
第 32趟 : 4 3 2 5 1 0 6 7 8 9
第 33趟 : 4 3 2 1 5 0 6 7 8 9
第 34趟 : 4 3 2 1 0 5 6 7 8 9
第 35趟 : 3 4 2 1 0 5 6 7 8 9
第 36趟 : 3 2 4 1 0 5 6 7 8 9
第 37趟 : 3 2 1 4 0 5 6 7 8 9
第 38趟 : 3 2 1 0 4 5 6 7 8 9
第 39趟 : 2 3 1 0 4 5 6 7 8 9
第 40趟 : 2 1 3 0 4 5 6 7 8 9
第 41趟 : 2 1 0 3 4 5 6 7 8 9
第 42趟 : 1 2 0 3 4 5 6 7 8 9
第 43趟 : 1 0 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

bubbleSort_2 test!
原始数组:9 8 7 6 5 4 3 2 1 0
第 0趟 : 8 9 7 6 5 4 3 2 1 0
第 1趟 : 8 7 9 6 5 4 3 2 1 0
第 2趟 : 8 7 6 9 5 4 3 2 1 0
第 3趟 : 8 7 6 5 9 4 3 2 1 0
第 4趟 : 8 7 6 5 4 9 3 2 1 0
第 5趟 : 8 7 6 5 4 3 9 2 1 0
第 6趟 : 8 7 6 5 4 3 2 9 1 0
第 7趟 : 8 7 6 5 4 3 2 1 9 0
第 8趟 : 8 7 6 5 4 3 2 1 0 9
第 9趟 : 8 7 6 5 4 3 2 0 1 9
第 10趟 : 8 7 6 5 4 3 0 2 1 9
第 11趟 : 8 7 6 5 4 0 3 2 1 9
第 12趟 : 8 7 6 5 0 4 3 2 1 9
第 13趟 : 8 7 6 0 5 4 3 2 1 9
第 14趟 : 8 7 0 6 5 4 3 2 1 9
第 15趟 : 8 0 7 6 5 4 3 2 1 9
第 16趟 : 0 8 7 6 5 4 3 2 1 9
第 17趟 : 0 7 8 6 5 4 3 2 1 9
第 18趟 : 0 7 6 8 5 4 3 2 1 9
第 19趟 : 0 7 6 5 8 4 3 2 1 9
第 20趟 : 0 7 6 5 4 8 3 2 1 9
第 21趟 : 0 7 6 5 4 3 8 2 1 9
第 22趟 : 0 7 6 5 4 3 2 8 1 9
第 23趟 : 0 7 6 5 4 3 2 1 8 9
第 24趟 : 0 7 6 5 4 3 1 2 8 9
第 25趟 : 0 7 6 5 4 1 3 2 8 9
第 26趟 : 0 7 6 5 1 4 3 2 8 9
第 27趟 : 0 7 6 1 5 4 3 2 8 9
第 28趟 : 0 7 1 6 5 4 3 2 8 9
第 29趟 : 0 1 7 6 5 4 3 2 8 9
第 30趟 : 0 1 6 7 5 4 3 2 8 9
第 31趟 : 0 1 6 5 7 4 3 2 8 9
第 32趟 : 0 1 6 5 4 7 3 2 8 9
第 33趟 : 0 1 6 5 4 3 7 2 8 9
第 34趟 : 0 1 6 5 4 3 2 7 8 9
第 35趟 : 0 1 6 5 4 2 3 7 8 9
第 36趟 : 0 1 6 5 2 4 3 7 8 9
第 37趟 : 0 1 6 2 5 4 3 7 8 9
第 38趟 : 0 1 2 6 5 4 3 7 8 9
第 39趟 : 0 1 2 5 6 4 3 7 8 9
第 40趟 : 0 1 2 5 4 6 3 7 8 9
第 41趟 : 0 1 2 5 4 3 6 7 8 9
第 42趟 : 0 1 2 5 3 4 6 7 8 9
第 43趟 : 0 1 2 3 5 4 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

bubbleSort_3 test!
原始数组:9 8 7 6 5 4 3 2 1 0
第 0趟 : 8 9 7 6 5 4 3 2 1 0
第 1趟 : 8 7 9 6 5 4 3 2 1 0
第 2趟 : 8 7 6 9 5 4 3 2 1 0
第 3趟 : 8 7 6 5 9 4 3 2 1 0
第 4趟 : 8 7 6 5 4 9 3 2 1 0
第 5趟 : 8 7 6 5 4 3 9 2 1 0
第 6趟 : 8 7 6 5 4 3 2 9 1 0
第 7趟 : 8 7 6 5 4 3 2 1 9 0
第 8趟 : 8 7 6 5 4 3 2 1 0 9
第 9趟 : 8 7 6 5 4 3 2 0 1 9
第 10趟 : 8 7 6 5 4 3 0 2 1 9
第 11趟 : 8 7 6 5 4 0 3 2 1 9
第 12趟 : 8 7 6 5 0 4 3 2 1 9
第 13趟 : 8 7 6 0 5 4 3 2 1 9
第 14趟 : 8 7 0 6 5 4 3 2 1 9
第 15趟 : 8 0 7 6 5 4 3 2 1 9
第 16趟 : 0 8 7 6 5 4 3 2 1 9
第 17趟 : 0 7 8 6 5 4 3 2 1 9
第 18趟 : 0 7 6 8 5 4 3 2 1 9
第 19趟 : 0 7 6 5 8 4 3 2 1 9
第 20趟 : 0 7 6 5 4 8 3 2 1 9
第 21趟 : 0 7 6 5 4 3 8 2 1 9
第 22趟 : 0 7 6 5 4 3 2 8 1 9
第 23趟 : 0 7 6 5 4 3 2 1 8 9
第 24趟 : 0 7 6 5 4 3 1 2 8 9
第 25趟 : 0 7 6 5 4 1 3 2 8 9
第 26趟 : 0 7 6 5 1 4 3 2 8 9
第 27趟 : 0 7 6 1 5 4 3 2 8 9
第 28趟 : 0 7 1 6 5 4 3 2 8 9
第 29趟 : 0 1 7 6 5 4 3 2 8 9
第 30趟 : 0 1 6 7 5 4 3 2 8 9
第 31趟 : 0 1 6 5 7 4 3 2 8 9
第 32趟 : 0 1 6 5 4 7 3 2 8 9
第 33趟 : 0 1 6 5 4 3 7 2 8 9
第 34趟 : 0 1 6 5 4 3 2 7 8 9
第 35趟 : 0 1 6 5 4 2 3 7 8 9
第 36趟 : 0 1 6 5 2 4 3 7 8 9
第 37趟 : 0 1 6 2 5 4 3 7 8 9
第 38趟 : 0 1 2 6 5 4 3 7 8 9
第 39趟 : 0 1 2 5 6 4 3 7 8 9
第 40趟 : 0 1 2 5 4 6 3 7 8 9
第 41趟 : 0 1 2 5 4 3 6 7 8 9
第 42趟 : 0 1 2 5 3 4 6 7 8 9
第 43趟 : 0 1 2 3 5 4 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9

通过上面可以看出在最坏情况下,这几种方法排序的次数是一样的。
下来再看看最好的情况下是什么情况:
bubbleSort test!
原始数组:0 1 2 3 4 5 6 7 8 9
第 0趟 : 0 1 2 3 4 5 6 7 8 9
第 1趟 : 0 1 2 3 4 5 6 7 8 9
第 2趟 : 0 1 2 3 4 5 6 7 8 9
第 3趟 : 0 1 2 3 4 5 6 7 8 9
第 4趟 : 0 1 2 3 4 5 6 7 8 9
第 5趟 : 0 1 2 3 4 5 6 7 8 9
第 6趟 : 0 1 2 3 4 5 6 7 8 9
第 7趟 : 0 1 2 3 4 5 6 7 8 9
第 8趟 : 0 1 2 3 4 5 6 7 8 9
第 9趟 : 0 1 2 3 4 5 6 7 8 9
第 10趟 : 0 1 2 3 4 5 6 7 8 9
第 11趟 : 0 1 2 3 4 5 6 7 8 9
第 12趟 : 0 1 2 3 4 5 6 7 8 9
第 13趟 : 0 1 2 3 4 5 6 7 8 9
第 14趟 : 0 1 2 3 4 5 6 7 8 9
第 15趟 : 0 1 2 3 4 5 6 7 8 9
第 16趟 : 0 1 2 3 4 5 6 7 8 9
第 17趟 : 0 1 2 3 4 5 6 7 8 9
第 18趟 : 0 1 2 3 4 5 6 7 8 9
第 19趟 : 0 1 2 3 4 5 6 7 8 9
第 20趟 : 0 1 2 3 4 5 6 7 8 9
第 21趟 : 0 1 2 3 4 5 6 7 8 9
第 22趟 : 0 1 2 3 4 5 6 7 8 9
第 23趟 : 0 1 2 3 4 5 6 7 8 9
第 24趟 : 0 1 2 3 4 5 6 7 8 9
第 25趟 : 0 1 2 3 4 5 6 7 8 9
第 26趟 : 0 1 2 3 4 5 6 7 8 9
第 27趟 : 0 1 2 3 4 5 6 7 8 9
第 28趟 : 0 1 2 3 4 5 6 7 8 9
第 29趟 : 0 1 2 3 4 5 6 7 8 9
第 30趟 : 0 1 2 3 4 5 6 7 8 9
第 31趟 : 0 1 2 3 4 5 6 7 8 9
第 32趟 : 0 1 2 3 4 5 6 7 8 9
第 33趟 : 0 1 2 3 4 5 6 7 8 9
第 34趟 : 0 1 2 3 4 5 6 7 8 9
第 35趟 : 0 1 2 3 4 5 6 7 8 9
第 36趟 : 0 1 2 3 4 5 6 7 8 9
第 37趟 : 0 1 2 3 4 5 6 7 8 9
第 38趟 : 0 1 2 3 4 5 6 7 8 9
第 39趟 : 0 1 2 3 4 5 6 7 8 9
第 40趟 : 0 1 2 3 4 5 6 7 8 9
第 41趟 : 0 1 2 3 4 5 6 7 8 9
第 42趟 : 0 1 2 3 4 5 6 7 8 9
第 43趟 : 0 1 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9


bubbleSort_1 test!
原始数组:0 1 2 3 4 5 6 7 8 9
第 0趟 : 0 1 2 3 4 5 6 7 8 9
第 1趟 : 0 1 2 3 4 5 6 7 8 9
第 2趟 : 0 1 2 3 4 5 6 7 8 9
第 3趟 : 0 1 2 3 4 5 6 7 8 9
第 4趟 : 0 1 2 3 4 5 6 7 8 9
第 5趟 : 0 1 2 3 4 5 6 7 8 9
第 6趟 : 0 1 2 3 4 5 6 7 8 9
第 7趟 : 0 1 2 3 4 5 6 7 8 9
第 8趟 : 0 1 2 3 4 5 6 7 8 9


bubbleSort_2 test!
原始数组:0 1 2 3 4 5 6 7 8 9
第 0趟 : 0 1 2 3 4 5 6 7 8 9
第 1趟 : 0 1 2 3 4 5 6 7 8 9
第 2趟 : 0 1 2 3 4 5 6 7 8 9
第 3趟 : 0 1 2 3 4 5 6 7 8 9
第 4趟 : 0 1 2 3 4 5 6 7 8 9
第 5趟 : 0 1 2 3 4 5 6 7 8 9
第 6趟 : 0 1 2 3 4 5 6 7 8 9
第 7趟 : 0 1 2 3 4 5 6 7 8 9
第 8趟 : 0 1 2 3 4 5 6 7 8 9
第 9趟 : 0 1 2 3 4 5 6 7 8 9
第 10趟 : 0 1 2 3 4 5 6 7 8 9
第 11趟 : 0 1 2 3 4 5 6 7 8 9
第 12趟 : 0 1 2 3 4 5 6 7 8 9
第 13趟 : 0 1 2 3 4 5 6 7 8 9
第 14趟 : 0 1 2 3 4 5 6 7 8 9
第 15趟 : 0 1 2 3 4 5 6 7 8 9
第 16趟 : 0 1 2 3 4 5 6 7 8 9
第 17趟 : 0 1 2 3 4 5 6 7 8 9
第 18趟 : 0 1 2 3 4 5 6 7 8 9
第 19趟 : 0 1 2 3 4 5 6 7 8 9
第 20趟 : 0 1 2 3 4 5 6 7 8 9
第 21趟 : 0 1 2 3 4 5 6 7 8 9
第 22趟 : 0 1 2 3 4 5 6 7 8 9
第 23趟 : 0 1 2 3 4 5 6 7 8 9
第 24趟 : 0 1 2 3 4 5 6 7 8 9
第 25趟 : 0 1 2 3 4 5 6 7 8 9
第 26趟 : 0 1 2 3 4 5 6 7 8 9
第 27趟 : 0 1 2 3 4 5 6 7 8 9
第 28趟 : 0 1 2 3 4 5 6 7 8 9
第 29趟 : 0 1 2 3 4 5 6 7 8 9
第 30趟 : 0 1 2 3 4 5 6 7 8 9
第 31趟 : 0 1 2 3 4 5 6 7 8 9
第 32趟 : 0 1 2 3 4 5 6 7 8 9
第 33趟 : 0 1 2 3 4 5 6 7 8 9
第 34趟 : 0 1 2 3 4 5 6 7 8 9
第 35趟 : 0 1 2 3 4 5 6 7 8 9
第 36趟 : 0 1 2 3 4 5 6 7 8 9
第 37趟 : 0 1 2 3 4 5 6 7 8 9
第 38趟 : 0 1 2 3 4 5 6 7 8 9
第 39趟 : 0 1 2 3 4 5 6 7 8 9
第 40趟 : 0 1 2 3 4 5 6 7 8 9
第 41趟 : 0 1 2 3 4 5 6 7 8 9
第 42趟 : 0 1 2 3 4 5 6 7 8 9
第 43趟 : 0 1 2 3 4 5 6 7 8 9
第 44趟 : 0 1 2 3 4 5 6 7 8 9


bubbleSort_3 test!
原始数组:0 1 2 3 4 5 6 7 8 9
第 0趟 : 0 1 2 3 4 5 6 7 8 9
第 1趟 : 0 1 2 3 4 5 6 7 8 9
第 2趟 : 0 1 2 3 4 5 6 7 8 9
第 3趟 : 0 1 2 3 4 5 6 7 8 9
第 4趟 : 0 1 2 3 4 5 6 7 8 9
第 5趟 : 0 1 2 3 4 5 6 7 8 9
第 6趟 : 0 1 2 3 4 5 6 7 8 9
第 7趟 : 0 1 2 3 4 5 6 7 8 9
第 8趟 : 0 1 2 3 4 5 6 7 8 9

可以看到在默认数组是 0 1 2 3 4 5 6 7 8 9的时候,第1、3种方法比较次数不变,2、4方法比较次数最少。
下来再测试下正常情况下几种排序方法比较
bubbleSort test!
原始数组:41 53 97 67 62 82 93 54 34 11
第 0趟 : 41 53 97 67 62 82 93 54 34 11
第 1趟 : 41 53 97 67 62 82 93 54 34 11
第 2趟 : 41 53 67 97 62 82 93 54 34 11
第 3趟 : 41 53 67 62 97 82 93 54 34 11
第 4趟 : 41 53 67 62 82 97 93 54 34 11
第 5趟 : 41 53 67 62 82 93 97 54 34 11
第 6趟 : 41 53 67 62 82 93 54 97 34 11
第 7趟 : 41 53 67 62 82 93 54 34 97 11
第 8趟 : 41 53 67 62 82 93 54 34 11 97
第 9趟 : 41 53 67 62 82 93 54 34 11 97
第 10趟 : 41 53 67 62 82 93 54 34 11 97
第 11趟 : 41 53 62 67 82 93 54 34 11 97
第 12趟 : 41 53 62 67 82 93 54 34 11 97
第 13趟 : 41 53 62 67 82 93 54 34 11 97
第 14趟 : 41 53 62 67 82 54 93 34 11 97
第 15趟 : 41 53 62 67 82 54 34 93 11 97
第 16趟 : 41 53 62 67 82 54 34 11 93 97
第 17趟 : 41 53 62 67 82 54 34 11 93 97
第 18趟 : 41 53 62 67 82 54 34 11 93 97
第 19趟 : 41 53 62 67 82 54 34 11 93 97
第 20趟 : 41 53 62 67 82 54 34 11 93 97
第 21趟 : 41 53 62 67 54 82 34 11 93 97
第 22趟 : 41 53 62 67 54 34 82 11 93 97
第 23趟 : 41 53 62 67 54 34 11 82 93 97
第 24趟 : 41 53 62 67 54 34 11 82 93 97
第 25趟 : 41 53 62 67 54 34 11 82 93 97
第 26趟 : 41 53 62 67 54 34 11 82 93 97
第 27趟 : 41 53 62 54 67 34 11 82 93 97
第 28趟 : 41 53 62 54 34 67 11 82 93 97
第 29趟 : 41 53 62 54 34 11 67 82 93 97
第 30趟 : 41 53 62 54 34 11 67 82 93 97
第 31趟 : 41 53 62 54 34 11 67 82 93 97
第 32趟 : 41 53 54 62 34 11 67 82 93 97
第 33趟 : 41 53 54 34 62 11 67 82 93 97
第 34趟 : 41 53 54 34 11 62 67 82 93 97
第 35趟 : 41 53 54 34 11 62 67 82 93 97
第 36趟 : 41 53 54 34 11 62 67 82 93 97
第 37趟 : 41 53 34 54 11 62 67 82 93 97
第 38趟 : 41 53 34 11 54 62 67 82 93 97
第 39趟 : 41 53 34 11 54 62 67 82 93 97
第 40趟 : 41 34 53 11 54 62 67 82 93 97
第 41趟 : 41 34 11 53 54 62 67 82 93 97
第 42趟 : 34 41 11 53 54 62 67 82 93 97
第 43趟 : 34 11 41 53 54 62 67 82 93 97
第 44趟 : 11 34 41 53 54 62 67 82 93 97


bubbleSort_1 test!
原始数组:62 29 16 96 61 95 25 62 75 90
第 0趟 : 29 62 16 96 61 95 25 62 75 90
第 1趟 : 29 16 62 96 61 95 25 62 75 90
第 2趟 : 29 16 62 96 61 95 25 62 75 90
第 3趟 : 29 16 62 61 96 95 25 62 75 90
第 4趟 : 29 16 62 61 95 96 25 62 75 90
第 5趟 : 29 16 62 61 95 25 96 62 75 90
第 6趟 : 29 16 62 61 95 25 62 96 75 90
第 7趟 : 29 16 62 61 95 25 62 75 96 90
第 8趟 : 29 16 62 61 95 25 62 75 90 96
第 9趟 : 16 29 62 61 95 25 62 75 90 96
第 10趟 : 16 29 62 61 95 25 62 75 90 96
第 11趟 : 16 29 61 62 95 25 62 75 90 96
第 12趟 : 16 29 61 62 95 25 62 75 90 96
第 13趟 : 16 29 61 62 25 95 62 75 90 96
第 14趟 : 16 29 61 62 25 62 95 75 90 96
第 15趟 : 16 29 61 62 25 62 75 95 90 96
第 16趟 : 16 29 61 62 25 62 75 90 95 96
第 17趟 : 16 29 61 62 25 62 75 90 95 96
第 18趟 : 16 29 61 62 25 62 75 90 95 96
第 19趟 : 16 29 61 62 25 62 75 90 95 96
第 20趟 : 16 29 61 25 62 62 75 90 95 96
第 21趟 : 16 29 61 25 62 62 75 90 95 96
第 22趟 : 16 29 61 25 62 62 75 90 95 96
第 23趟 : 16 29 61 25 62 62 75 90 95 96
第 24趟 : 16 29 61 25 62 62 75 90 95 96
第 25趟 : 16 29 61 25 62 62 75 90 95 96
第 26趟 : 16 29 25 61 62 62 75 90 95 96
第 27趟 : 16 29 25 61 62 62 75 90 95 96
第 28趟 : 16 25 29 61 62 62 75 90 95 96
第 29趟 : 16 25 29 61 62 62 75 90 95 96


bubbleSort_2 test!
原始数组:18 51 41 54 94 7 96 5 17 95
第 0趟 : 18 51 41 54 94 7 96 5 17 95
第 1趟 : 18 41 51 54 94 7 96 5 17 95
第 2趟 : 18 41 51 54 94 7 96 5 17 95
第 3趟 : 18 41 51 54 94 7 96 5 17 95
第 4趟 : 18 41 51 54 7 94 96 5 17 95
第 5趟 : 18 41 51 54 7 94 96 5 17 95
第 6趟 : 18 41 51 54 7 94 5 96 17 95
第 7趟 : 18 41 51 54 7 94 5 17 96 95
第 8趟 : 18 41 51 54 7 94 5 17 95 96
第 9趟 : 18 41 51 54 7 94 5 17 95 96
第 10趟 : 18 41 51 54 7 94 5 17 95 96
第 11趟 : 18 41 51 54 7 5 94 17 95 96
第 12趟 : 18 41 51 54 5 7 94 17 95 96
第 13趟 : 18 41 51 5 54 7 94 17 95 96
第 14趟 : 18 41 5 51 54 7 94 17 95 96
第 15趟 : 18 5 41 51 54 7 94 17 95 96
第 16趟 : 5 18 41 51 54 7 94 17 95 96
第 17趟 : 5 18 41 51 54 7 94 17 95 96
第 18趟 : 5 18 41 51 54 7 94 17 95 96
第 19趟 : 5 18 41 51 54 7 94 17 95 96
第 20趟 : 5 18 41 51 7 54 94 17 95 96
第 21趟 : 5 18 41 51 7 54 94 17 95 96
第 22趟 : 5 18 41 51 7 54 17 94 95 96
第 23趟 : 5 18 41 51 7 54 17 94 95 96
第 24趟 : 5 18 41 51 7 54 17 94 95 96
第 25趟 : 5 18 41 51 7 17 54 94 95 96
第 26趟 : 5 18 41 51 7 17 54 94 95 96
第 27趟 : 5 18 41 7 51 17 54 94 95 96
第 28趟 : 5 18 7 41 51 17 54 94 95 96
第 29趟 : 5 7 18 41 51 17 54 94 95 96
第 30趟 : 5 7 18 41 51 17 54 94 95 96
第 31趟 : 5 7 18 41 51 17 54 94 95 96
第 32趟 : 5 7 18 41 17 51 54 94 95 96
第 33趟 : 5 7 18 41 17 51 54 94 95 96
第 34趟 : 5 7 18 41 17 51 54 94 95 96
第 35趟 : 5 7 18 41 17 51 54 94 95 96
第 36趟 : 5 7 18 41 17 51 54 94 95 96
第 37趟 : 5 7 18 17 41 51 54 94 95 96
第 38趟 : 5 7 17 18 41 51 54 94 95 96
第 39趟 : 5 7 17 18 41 51 54 94 95 96
第 40趟 : 5 7 17 18 41 51 54 94 95 96
第 41趟 : 5 7 17 18 41 51 54 94 95 96
第 42趟 : 5 7 17 18 41 51 54 94 95 96
第 43趟 : 5 7 17 18 41 51 54 94 95 96
第 44趟 : 5 7 17 18 41 51 54 94 95 96


bubbleSort_3 test!
原始数组:2 45 20 54 87 13 26 64 7 93
第 0趟 : 2 45 20 54 87 13 26 64 7 93
第 1趟 : 2 20 45 54 87 13 26 64 7 93
第 2趟 : 2 20 45 54 87 13 26 64 7 93
第 3趟 : 2 20 45 54 87 13 26 64 7 93
第 4趟 : 2 20 45 54 13 87 26 64 7 93
第 5趟 : 2 20 45 54 13 26 87 64 7 93
第 6趟 : 2 20 45 54 13 26 64 87 7 93
第 7趟 : 2 20 45 54 13 26 64 7 87 93
第 8趟 : 2 20 45 54 13 26 64 7 87 93
第 9趟 : 2 20 45 54 13 26 7 64 87 93
第 10趟 : 2 20 45 54 13 7 26 64 87 93
第 11趟 : 2 20 45 54 7 13 26 64 87 93
第 12趟 : 2 20 45 7 54 13 26 64 87 93
第 13趟 : 2 20 7 45 54 13 26 64 87 93
第 14趟 : 2 7 20 45 54 13 26 64 87 93
第 15趟 : 2 7 20 45 54 13 26 64 87 93
第 16趟 : 2 7 20 45 54 13 26 64 87 93
第 17趟 : 2 7 20 45 54 13 26 64 87 93
第 18趟 : 2 7 20 45 13 54 26 64 87 93
第 19趟 : 2 7 20 45 13 26 54 64 87 93
第 20趟 : 2 7 20 45 13 26 54 64 87 93
第 21趟 : 2 7 20 45 13 26 54 64 87 93
第 22趟 : 2 7 20 13 45 26 54 64 87 93
第 23趟 : 2 7 13 20 45 26 54 64 87 93
第 24趟 : 2 7 13 20 45 26 54 64 87 93
第 25趟 : 2 7 13 20 26 45 54 64 87 93
第 26趟 : 2 7 13 20 26 45 54 64 87 93


通过常规数组比较发现,1、3种方法比较趟数都是44趟,2、4方法比较趟数明显减少,综合来看,第4种方法排序效率最高。

下来随机生成10000个数据,通过电脑时钟读取这几种排序方法所用的排序时间。
在这里插入图片描述
通过对这4种排序方法的排序时间测试可以看出,第4种方法排序耗时和所用趟数都是最少的。

下面放一张网上找到的动图,可以更清晰的看到数据交换过程。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章