私は私のデータ構造クラスのための時間の複雑さについて多くのことを研究してきました。そして、私はシェルソートアルゴリズムについて報告し、その時の複雑さ(最高/最悪/平均の場合)を説明する使命を帯びてきました。私はこのサイトが見つからhttps://stackabuse.com/shell-sort-in-java/このシェルソートアルゴリズムの時間計算することを示していること:
void shellSort(int array[], int n){
//n = array.length
for (int gap = n/2; gap > 0; gap /= 2){
for (int i = gap; i < n; i += 1) {
int temp = array[i];
int j;
for (j = i; j >= gap && array[j - gap] > temp; j -= gap){
array[j] = array[j - gap];
}
array[j] = temp;
}
}
}
あるO(N Nログ)。しかし、問題は、私がまだ可能LOGNについて困惑しているということですLOGNをかnlogn手段を何。
私はまた、ステップカウント方法を試してみましたが、再び、私はちょうど上記のサイトからコピーされ、これをしなかったので、開始する場所を知っていません。
void shellSort(int array[], int n){
//n = array.length
for (int gap = n/2; gap > 0; gap /= 2){ //step 1 = runs logn times
for (int i = gap; i < n; i += 1) { //step 2 = runs n-gap times
int temp = array[i]; //step 3 = 1
int j; //step 4 = 1
for (j = i; j >= gap && array[j - gap] > temp; j -= gap){ //step 5 = i/gap times
array[j] = array[j - gap]; //step 6 = 1
}
array[j] = temp; //step 7 = 1
}
}
}
しかし、私はこれが正しいならば、私はこのサイト上でそれをオフに基づいて知りません。https://stackabuse.com/shell-sort-in-java/。
私はまた、シェルソートソート挿入し、バブルを一般化したものであるため、ソートソートの挿入とシェルとの間の移動の合計数を比較してみました。私は下の写真を添付します。私はまた私に与えるオンライン番号ジェネレータ使用100個の乱数を、それをコピーして、ソートソートの挿入とシェルの両方に適用し、ソートする配列としてそれを割り当て。
そして、これが思い付いたものでした、
挿入の動きの総数ソート = 4731
シェルソートの移動の総数 = 1954
私はこのすべてから理解しましたことは、それはシェルソート速く挿入ソートよりも2倍であるように100の要素として大きな配列をソートすることになると、シェルにもかかわらず、ソート、ソートの挿入の一般化されていることです。
しかし、究極の質問は、このシェルソートアルゴリズムのような時間の複雑さを計算するための初心者の方法は何ですか?
あなたは、あなたの関数の大きなOまたはビッグシータ解析を見てみる必要があります。それが実行されることを全体的な時間は、ログn個であるので、あなたの外側のループが反復ごとに半分に分割されています。あなたの内側のループを見たときに今、それはすべての1への道nまたは2 nにN / 2から最初に実行されるn個の実行時間がn / 2 + N / 4 +になるので、nの初期サイズによって異なります。 ...あなたにも等比級数を検索することができ、そのA 'ハーモニック・シリーズ'(N / 2 ^ kの、あなたの要因のnの場合- > N(1/2 + 1/4 + ... + 1/2 ^ k)はこれは等しいN LOGN。今、すべてのリストがある程度ソートすることができる最良の場合は、Ω(n個になります LOGN)外側のループの真ん中のように、我々はそのn個を言うことができますので、我々は、最適な解決策を見つけるでしょうLOGNは、その下限である-平均的なケースのI用してくださいノート-私たちは、平均的なケースは、Θ(nlog ^ 2 n)は、それはそれでバインドタイトであることを意味していると言うことができ、そのため-それは間違いなく同じかそれよりも大きい意味しますビッグシータ。今、私たちは、リストが完全に外側のループはログnを意味最後まですべての方法を実行します逆であると仮定した場合。間のループは実行n個ます LOGN合計時間があることn個になるので、我々はそれがOになると言うことができますどの^ 2(n)のログ(nはログイン^ 2(n))は(我々はまた、ビッグOを使用することができますが、シータは、より良いあなたができることですシータがタイトバウンド、大きなOをどのように提供するかだけの上限提供することまでは検索してください)。したがって、我々はまた、最悪の場合には、いくつかの文脈では比較的正確であるO(N ^ 2)であると言うことができます。
私はあなたがこの場合にも役立つことができビッグ-Oとビッグシータだけでなく、ビッグ・オメガを見てみましょうお勧めします。
しかし、シェルアルゴリズムのための最も正確な数学的表現は、O(N ^ 3/2)であろう。しかし、起こって引数とanalyzationが残っています。
私はこのことができます願っています。