イベントアドレス: CSDN 21 日間学習チャレンジ
序文
古典的な並べ替えアルゴリズムは聞いたことがある人、使ったことがある人も多いかもしれませんが、聞いたことがない人も多いでしょう。なぜ?フレームワークや依存パッケージが増えてきた今、実際のソートのシーンを使って業務として機能に落とし込むことができるようになるため、機能は知っていても動作ロジックを知らない人もいます。
以上を踏まえて、関数の操作ロジックをよりよく理解するために、基本的なソート方法の操作ルールと個人的な理解を整理しました。
この記事では、ヒルソーティングについて説明します。簡単に言えば、ヒル ソートとは、配列を分割して別々にソートすることです。
ヒルソート
ヒル ソートは、縮小インクリメンタル ソートとも呼ばれる、挿入ソートに基づくクイック ソート アルゴリズムです。配列の一方の端からもう一方の端にビット単位でしか要素を移動できないため、単純な挿入ソートは順序が正しくない大規模な配列では処理が遅くなります。Hillsort は単に挿入ソートを高速化するために改良したものであり、O(n2) を破った最初のアルゴリズムの 1 つです。
ヒルソーティングの実施原理
- 一定の増分に従って配列をグループ化し, 直接挿入ソートアルゴリズムを使用して各グループをソートします. Hill によって提案された距離は N/2 であり, 各ソートは 2 つの半分に分割されます. つまり, N の配列の場合=10、増分 スペーサー シーケンスは 5、2、1 です。
- その後、増分を縮小し、グループ化とソートを続けます;増分が徐々に減少するにつれて、各グループにはますます多くのキーワードが含まれます.増分が1に減少すると、配列全体が1つのグループに分割され、再度ソートすると、配列全体が完成します.ソート;
コード
function shellSort(array) {
//每次向下得到一半的增量
for (let gap = Math.floor(array.length / 2); gap > 0; gap = Math.floor(gap / 2)) {
//每个分组进行插入排序
for (let i = gap; i < array.length; i++) {
let j = i;
let tmp = array[j];
// 如果同一组中 前数大于后数,则交换他们
if (array[j] < array[j - gap]) {
while (j - gap >= 0 && array[j - gap] > tmp) {
array[j] = array[j - gap];
j = j - gap;
}
array[j] = tmp;
}
}
}
console.log('shellSort result', array);
}
shellSort([2, 4, 7, 9, 0, 1, 2, 3, 5, 6, 8]);
戻り値
複雑さ
時間の複雑さ:
- 最良のケース: シーケンスは正の順序で配置されます。この場合、比較操作を (n-1) 回実行する必要があります。シフトバック代入演算は0回です。それは O(n)
- 最悪の場合: O(nlog2n)。
- 漸近時間計算量 (平均時間計算量): O(nlog2n)
スペースの複雑さ: O(2n)
メッセージ
ヒルソートは全体的に最も不安定ですが、最良の場合、非常に優れたソート方法です! 長所と短所は同じように明白です。注意して使用してください!