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)
。