本ページには広告が含まれています。
引数に指定された配列をシェーカーソートで並び替えます。
- 構文
- shakerSort( array )
- 引数
- array 必須
- ソートする数値を格納した配列。参照引数。
- 戻り値
プログラム
解説
- 2-3行目
- 4,22行目
- 無限ループ。
- 5行目
- lastSwapIndexにtopIndexを代入。
- 6,11行目
- topIndexがbottomIndexになるまで繰り返す。
- 7-10行目
- 配列のn番目がn+1番目より大きかったら、その2つを入れ替える。lastIndexにnを代入する。
- 12行目
- bottomIndexにlastSwapIndexを代入。
- 13行目
- topIndexとbottomIndexが等しかったらループを抜ける。
- 14,19行目
- bottomIndexからtopIndex+1まで繰り返す。
- 15-18行目
- 配列のn番目がn-1番目より小さかったら、その2つを入れ替える。lastIndexにnを代入する。
- 20行目
- bottomIndexにlastSwapIndexを代入。
- 21行目
- topIndexとbottomIndexが等しかったらループを抜ける。
使い方
- 結果
シェーカーソート
シェーカーソートは、ソートのアルゴリズムの一つです。バブルソートを改良したもの。双方向バブルソート、改良交換法とも言われます。
バブルソートでは、配列の要素を1つずつ比較していくため、逆に整列された配列の場合には非常に遅いという問題があります。シェーカーソートは、配列を前から順番に比較するだけでなく、後ろからも比較することで、配列の整列をより効率的に行います。
アルゴリズム
バブルソートで1回スキャンを行うと最後の要素1個がスキャン範囲中最大であることがわかり、次回のスキャン範囲を1狭めることができます。さらに、このスキャンの最後で連続してm個の要素の交換が行われていなければそのm個についてはソート済みであることが分かるので、次回のスキャン範囲をm狭めることができます。この工夫で、後半が殆ど整列済みのデータに対してバブルソートが高速に行えるようになります。
| 最悪計算時間 | \(O(n^{2})\) |
|---|
- 最初に、カレントポインタを配列の先頭、終端ポインタを配列の末尾に設定します。
- カレントポインタが終端ポインタに到達するまで、以下の処理を繰り返します。
- カレントポインタとその次の要素を比較し、大小関係が逆ならば、交換します。
- カレントポインタを1つ進めます。
- 終端ポインタとその前の要素を比較し、大小関係が逆ならば、交換します。
- 終端ポインタを1つ戻します。
- カレントポインタが終端ポインタに到達したら、ソートが完了です。
関連記事
- QSORT関数 (スクリプト関数)
- 配列の中身をソートします。
- bubbleSort関数 (自作関数)
- 引数に指定された配列を バブルソート で並び替えます。
- gnomeSort関数 (自作関数)
- 引数に指定された配列を ノームソート で並び替えます。
- insertionSort関数 (自作関数)
- 引数に指定された配列を 挿入ソート で並び替えます。
- small関数 (自作関数)
- 配列の中で小さい方から数えた順位の値を求めます。
- shellSort関数 (自作関数)
- 引数に指定された配列を シェルソート で並び替えます。
- heapSort関数 (自作関数)
- 引数に指定された配列を ヒープソート で並び替えます。
- quickSort関数 (自作関数)
- 引数に指定された配列を クイックソート で並び替えます。
- shearSort関数 (自作関数)
- 引数に指定された配列を シェアソート で並び替えます。
- RESIZE関数 (スクリプト関数)
- 配列の上限値を取得または変更します。配列の上限値を変更する場合は第二引数に値を指定します。
