まず、これが私のシェルソートコードです(Javaを使用):
public char[] shellSort(char[] chars) {
int n = chars.length;
int increment = n / 2;
while(increment > 0) {
int last = increment;
while(last < n) {
int current = last - increment;
while(current >= 0) {
if(chars[current] > chars[current + increment]) {
//swap
char tmp = chars[current];
chars[current] = chars[current + increment];
chars[current + increment] = tmp;
current -= increment;
}
else { break; }
}
last++;
}
increment /= 2;
}
return chars;
}
これは、シェルの並べ替えの正しい実装ですか (今のところ、最も効率的なギャップ シーケンスについて忘れています。たとえば、1,3,7,21...)。Shell Sort の最適な時間計算量は O(n) であると聞いたので質問します。( http://en.wikipedia.org/wiki/Sorting_algorithmを参照)。このレベルの効率が私のコードで実現されているとは思えません。ヒューリスティックを追加した場合は、そうですが、現状では違います。
そうは言っても、今の私の主な質問は、シェルソート実装の Big O 時間の複雑さを計算するのが難しいということです。最も外側のループは O(log n)、中間のループは O(n)、最も内側のループも O(n) と特定しましたが、内側の 2 つのループは実際には O( n) - それらはこれよりはるかに少ないでしょう - どのようなものであるべきですか? 明らかに、このアルゴリズムは O((log n) n^2) よりもはるかに効率的に実行されるためです。
私は非常に迷っているので、どんなガイダンスも大歓迎です!:P