シェルソート


関数名
shellSort  シェルソート
形式
void shellSort(DATA *data, int nmem, int asdes);
引数
typedef struct {
    int key;        /* 比較のキーとなるフィールド */
    int info;       /* その他のフィールド */
} DATA;

data   (入出力)データレコードの配列
nmem   (入力) レコード配列の大きさ
asdes  (入力) 昇順・降順別、0:昇順, 1:降順
関数値
なし
注意事項

用例(shellSort-test.c

プログラム(shellSort.c
void shellSort(DATA *data, int nmem, int asdes)
{
    int i, j, k;
    int h;
    DATA t;

    for (h = 1; h <= nmem; h = 3*h + 1);

    while ((h = h/3) >= 1) {
        for (i = h; i < nmem; i++) {
            t.key = data[i].key;
            t.info = data[i].info;
            for (j = i - h; j >= 0; j -= h)
                if (asdes == 0) {
                    if (data[j].key > t.key) {
                        data[j+h].key = data[j].key;
                        data[j+h].info = data[j].info;
                    } else break;
                } else {
                    if (data[j].key < t.key) {
                        data[j+h].key = data[j].key;
                        data[j+h].info = data[j].info;
                    } else break;
                }
            data[j+h].key = t.key;
            data[j+h].info = t.info;
        }
    }
}
説明
挿入ソートが遅いのは、隣の要素同士しか交換しないからである。 たとえば、最小の要素がたまたま最後にあった場合は、それを最初に移 動させるにはN回の比較と交換かかる。シェルソートは、挿入ソートの の拡張として、遠く離れている要素の間でも交換するように高速化を はかったものである。

そのアイデアとしては、h要素分だけ離れた要素同士をまずソートし、h の値をだんだん小さくしながらソートを繰り返す。最後には、h=1でソー トする。

関連関数
選択ソート挿入ソートバブルソートクイックソート