シェルソートを学習をしています
サイトで拾ってきたコードなんですがアルゴリズムの7,8行目のfor文が理解できません
間隔の決め方はh=h*3+1を満たす1,4,13,40,121...の中から要素数/9を超えない一番大きい
値を選ぶと学んだのですが,もし要素数が120個あるとして下のfor文だと間隔が4で決定してしまいませんか?
120/9だと13になるので1,4,13,40,121...のなかの13は超えていないので間隔は13になるとおもうのですが...
私の手順としては
1.h_tmpに1を入れ
2.条件式をおこない真なら下の処理h=h_tmpを行う
3.変化式?のh_tmp=h_tmp*3+1を行う
4再び条件式をおこなう
こんな感じです
手順が間違っているのでしょうか?
教えてください
コード void shell_sort(int* array, size_t size) { // 最初の間隔 h を決める // 1,4,13,40,121... のように、1 から始めて h=h*3+1 を満たす値を使う。 // これらの値の中で、size / 9 を超えない一番大きい値を最初の h とする。 size_t h = 1; for( size_t h_tmp = 1; h_tmp < size / 9; h_tmp = h_tmp * 3 + 1 ){ h = h_tmp; } while( h > 0 ){ for( size_t i = h; i < size; ++i ){ int tmp = array[i]; if( array[i-h] > tmp ){ // 挿入が必要か先に調べる size_t j = i; do { array[j] = array[j-h]; j -= h; } while( j >= h && array[j-h] > tmp ); array[j] = tmp; } } h /= 3; // 間隔を縮める } }
/
void shell_sort(int array, size_t size)
{
// 最初の間隔 h を決める
// 1,4,13,40,121... のように、1 から始めて h=h*3+1 を満たす値を使う。
// これらの値の中で、size / 9 を超えない一番大きい値を最初の h とする。
size_t h = 1;
for( size_t h_tmp = 1; h_tmp < size / 9; h_tmp = h_tmp * 3 + 1 ){
h = h_tmp;
}
while( h > 0 ){ for( size_t i = h; i < size; ++i ){ int tmp = array[i]; if( array[i-h] > tmp ){ // 挿入が必要か先に調べる size_t j = i; do { array[j] = array[j-h]; j -= h; } while( j >= h && array[j-h] > tmp ); array[j] = tmp; } } h /= 3; // 間隔を縮める }
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/24 11:07 編集
2021/01/24 11:13 編集
2021/01/24 11:50
2021/01/24 11:52
2021/01/24 11:56