シェル‐ソート【shell sort】
シェルソート
シェルソートとは、ソート(整列)のアルゴリズムの一種で、挿入ソートを改良したアルゴリズムのことである。アメリカのコンピュータ科学者ドナルド・シェル(Donald Shell)によって考案された。
シェルソートの原型となっている挿入ソートは、もっとも単純なアルゴリズムの一つで、原理上ランダムな並びのデータを整列させるには効率が悪いという欠点がある。シェルソートでは、初めに大きなデータと小さなデータとを大まかに分け、その後に挿入ソートを行う、という手順を踏むことで、挿入ソートの効率化を図ろうとするものである。
シェルソートでは、まず一定間隔の全てのデータの組み合わせに対して小さなデータが前にくるよう交換処理を行う。これを、間隔を小さくしながら隣同士の交換になるまで同じことを繰り返し、最後には挿入ソートを行う。
なお、同じデータの順番がソート前後によって変化しないソート手法を「安定なソート」と言うが、挿入ソートとは違い、シェルソートは安定なソートではない。
シェルソート
(Shellsort から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/06 14:29 UTC 版)
ナビゲーションに移動 検索に移動
![]() 間隔 23, 10, 4, 1 でのシェルソートの実行 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
クラス | ソート | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
データ構造 | 配列 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
最悪計算時間 | 間隔に依存 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
最良計算時間 |
![]() シェルソート(改良挿入ソート、英語: Shellsort, Shell sort, Shell's method)は、1959年にドナルド・シェルが開発した[2]ソートのアルゴリズム。挿入ソートの一般化[3]であり、配列の中である程度間隔が離れた要素の組ごとに挿入ソートを行い、間隔を小さくしながら同様のソートを繰り返すことで高速化するアルゴリズムである。ただし、挿入ソートと異なり、安定ソートではなくなる。 アルゴリズムアルゴリズムの基本は挿入ソートと同じである。挿入ソートは「ほとんど整列されたデータに対しては高速」という長所を持つが、隣接した要素同士しか比較・交換を行わないため、あまり整列されていないデータに対しては低速であった。
動作例初期データ:
この例では、間隔hを4→2→1(2の累乗)とする。
同じグループ内で挿入ソートし、h=2にする。
同じグループ内で挿入ソートし、h=1にする。
間隔が1ということは、全体が同じ1つのグループということである。これを挿入ソートする。
間隔の決め方シェルソートの実行時間(時間計算量)は、比較時に選ぶ間隔hによって大きく異なる。
これらの数列をソートの間隔として利用する際は、(要素数以内で)大きな数字から狭めていく。を使う場合、間隔hを121→40→13→4→1とする(hを3で整数除算していけばよい)。
C++による実装例template <typename RandomAccessIterator, typename Compare>
void shellsort(RandomAccessIterator first, RandomAccessIterator last, Compare comp,
const double sk = 3.14159265358979323846264338327950, const short m = 5)
{
if(first == last)
return;
double gap = distance(first, last);
std::ptrdiff_t h;
do
{
gap /= sk;
h = (std::ptrdiff_t)(gap + 0.5);
if(h < m)
h = 1;
RandomAccessIterator H = first + h;
for(RandomAccessIterator i = H; i < last; ++i)
{
if(comp(*i, *(i - h)))
{
auto t = std::move(*i);
RandomAccessIterator j = i;
do
{
*j = std::move(*(j - h));
j -= h;
}while(H <= j && comp(t, *(j - h)));
*j = std::move(t);
}
}
}while(1 < h);
}
脚注
「Shellsort」の関連用語
検索ランキング
Shellsortのページの著作権
ビジネス|業界用語|コンピュータ|電車|自動車・バイク|船|工学|建築・不動産|学問
©2025 GRAS Group, Inc.RSS |