バブルソートと複雑さの分析

http://www.cnblogs.com/jiqingwu/p/bubble_sort_analysis.html

  • 問題:昇順(具体的には、非降順)に、整数のシーケンスが与えられるが、整数のシーケンスで配置されています。
  • 入力:整数のシーケンス。
  • 出力:整数のシーケンス、前記整数昇順。

C言語はハオが強い教科書ので、我々は最も精通している、おそらくバブルソートです。
以下では、C言語のバブルソートであるa配列の最初のアドレスである、  size 配列要素の数です。

バブルソートは、アレイ最後から二番目の位置にフロートの多数が続く配列、の最後の位置に浮動の最大数を許容することであると思った......
もちろん、あなたも降順でき、背面から前面に連れて行くことができますバブル。前記比較動作と隣接する交換素子。

void bubble_sort(int *a, int size)
{
  int i, j, t;
  for(i = 1; i < size; ++i){
    for(j = 0; j < size -i; ++j){
      if(a[j] > a[j+1]){
        t = a[j];
        a[j] = a[j+1];
        a[j+1] = t;
      }
    } // end for j
  }// end for i
}

時間の複雑さの分析。1回-外側ループは、そのNを実行します。ほとんどは、一度平均実行行う少なくとも内部ループ、N回行わ  (N+1)/2回。
これは、本体の交換サイクルの実行についての詳細である  (N - 1)(N + 1) / 2 = (N^2 - 1)/2(これはN^2ラテックス表記モデル化され、Nは、正方形を表します)。計算の複雑さの原理によれは、定数は複雑の最高係数、学位を除いて、削除されますO(N^2)

パフォーマンスアルゴリズムを泡立てます。上記のアルゴリズムの性能向上の余地があります。整数のシーケンスを与え  [9, 3, 4, 5, 7]、整数のシーケンスを変更するために、上述したアウターループアルゴリズムを完了するたびに。

9, 3, 4, 5, 7
3, 4, 5, 7, 9 (i = 1)
3, 4, 5, 7, 9 (i = 2)
3, 4, 5, 7, 9 (i = 3)
3, 4, 5, 7, 9 (i = 4)

私たちは、外側のループが完了した後に初めて、ソートが完了していることがわかりました。比較的後者のサイクルが、無交換。
主要外部ループは、いかなる交換素子に隣接発生していない場合は、この時間は、ループの外であってもよく、アレイが注文されてい示します。
このように、我々は交換は、アルゴリズムのリターンを発生しなかった場合は交換は、外側のループ・レコーディング後に行われるかどうかを、ブール変数を設定することができます。

改善されたバブルソートC言語は以下のとおりです。

void bubble_sort_enhanced(int *a, int size)
{
    int i, j, t;
    unsigned char swapped;
    for(i = 1; i < size; ++i) {
        swapped = 0;
        for(j = 0; j < size - i; ++j) {
            if(a[j] > a[j+1]){
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
                swapped = 1;
            }
        }
        if(!swapped)
            break;
    }
}

按照改进的算法,对于一个已经有序的数组,算法完成第一次外层循环后就会返回。
实际上只发生了 N - 1次比较,所以最好的情况下,该算法复杂度是O(N)


おすすめ

転載: blog.csdn.net/Kurry4ever_/article/details/80883491