ソートアルゴリズムの実装
私の JS スキルは低いので、JAVA と C に似た方法を使用して JavaScript のソート アルゴリズムを作成します。
ここではアルゴリズムの原則については説明しません。コードの実装についてのみ説明します。バグがある可能性があります。ガイダンスとしてブログにコメントしてください。
挿入ソート
Insertion-Sort のアルゴリズムの説明は、シンプルで直感的な並べ替えアルゴリズムです。ソートされていないデータの場合は、ソートされたシーケンスを後ろから前にスキャンし、対応する位置を見つけて挿入します。挿入ソートの実装では、通常、インプレース ソート (つまり、O(1) 個の余分なスペースのみを使用するソート) が使用されます。そのため、後ろから前へのスキャン プロセス中に、繰り返し、徐々にシフトする必要があります。要素を後方にソートし、最新の要素の挿入スペースを提供します。
実装コードは次のとおりです:
function insertSort(arr) { if (!arr) return; var len = arr.length; if (len == 0 || len == 1) return; for (var i = 1, len = arr.length; i < len; i ++) { var stand = arr[i]; for (var j = i - 1; j >= 0; j --) { if (arr[j] > stand) { arr[j + 1] = arr[j]; } else { arr[j + 1] = stand; break; } } } return arr; }
時間計算量は O(n^2)
もちろん、検索と置換の位置アルゴリズムを二分探索に変更するなど、このアルゴリズムを最適化する余地はあります。
バブルソート
古典的なソートアルゴリズム、バブルソートとなると心が痛む。私は学部時代にバブルソートアルゴリズムの改良に関する必須論文を書きましたが、その結果、論文を書き終えた後、バブルソートアルゴリズムを完全に実装することができませんでした。
if (!arr) return; var len = arr.length; if (len == 0 || len == 1) return; for (var i = 0; i < len; i ++) { for (var j = 0; j < len - i - 1; j ++) { if (arr[j] > arr[j + 1]) { var tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp; } } } return arr; }
時間計算量は次のとおりです: O(n^2)
クイックソート
非常に古典的な並べ替えアルゴリズム。並べ替えプロセスは主に 3 つのステップに分かれています。
実装コードは次のとおりです:
function quickSort(arr, bt, ed) { if (bt < ed) { var pivot = findPartition(arr, bt, ed); quickSort(arr, bt, pivot - 1); quickSort(arr, pivot + 1, ed); } } function findPartition(arr, bt, ed) { var stand = arr[bt]; while (bt < ed) { while (bt < ed && arr[ed] >= stand) { ed --; } if (bt < ed) { arr[bt ++] = arr[ed]; } while (bt < ed && arr[bt] <= stand) { bt ++; } if (bt < ed) { arr[ed --] = arr[bt]; } } arr[bt] = stand; return bt; }
時間計算量は O(nlogn) です。
並べ替えを結合
これは非常に古典的な並べ替えアルゴリズムでもあり、js を学ぶ機会を利用して古典的な並べ替えアルゴリズムを復習しました。マージ ソートのアイデアについては、私のブログ「マージ ソート」を参照してください。ここではjsの実装のみを書きます。
function mergeSort(arr, bt, ed) { if (bt < ed) { var mid = bt + parseInt((ed - bt) / 2); mergeSort(arr, bt, mid); mergeSort(arr, mid + 1, ed); mergeArray(arr, bt, mid, ed); } } function mergeArray(arr, bt, mid, ed) { var mArr = []; var i = bt, j = mid + 1; while (i <= mid && j <= ed) { if (arr[i] <= arr[j]) { mArr.push(arr[i++]); } else { mArr.push(arr[j ++]); } } if (i <= mid) { mArr = mArr.concat(arr.slice(i, mid + 1)); } if (j <= ed) { mArr = mArr.concat(arr.slice(j, ed + 1)); } for (var h = 0; h < mArr.length; h ++) { arr[bt + h] = mArr[h]; } }
マージ ソートを作成するときに、もう 1 つの小さなエピソードがありました。js は自動的に切り上げることができなかったので、後で parseInt メソッドを使用しました。これは非常に魅力的でした。