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種方法排序耗時和所用趟數都是最少的。

下面放一張網上找到的動圖,可以更清晰的看到數據交換過程。
在這裏插入圖片描述

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