JavaScriptにおける挿入ソートアルゴリズムの実装


計算機科学においては,ソートアルゴリズムとしてかなり多くのツールが使用される.我々は、プログラマやエンジニアとしてのデータをふるいに毎日、それらに依存し、彼らはほとんどすべての近代的なプログラミング言語に1つまたは方法別に組み込まれている.
言語のビルトインのソーティング機能を使用すると、ほとんどの日々の仕事のために仕事を得ることがありますが、それはどのようなフードの下で何が起こっているかを理解することが重要であり、どのような別のソートアルゴリズムは実際にやっている理由と彼らは彼らが行う方法を動作します.それは頻繁に来ていない可能性がありますが、いつでもチャンスを実装したり、技術的なインタビューの設定でソートアルゴリズムを説明するように求められる可能性がありますが、正確にこのポストはここにあなたを準備することです!
今日、コンピュータサイエンスの基本的なソートアルゴリズムの1つであるInsertion Sortを見ていきます.

挿入ソートとは


アルゴリズムのWikipedia pageとして説明します.

Insertion sort is a simple sorting algorithm that builds the final sorted array (or list) one item at a time. ... Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. At each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.

Sorting is typically done in-place, by iterating up the array, growing the sorted list behind it. At each array-position, it checks the value there against the largest value in the sorted list (which happens to be next to it, in the previous array-position checked). If larger, it leaves the element in place and moves to the next. If smaller, it finds the correct position within the sorted list, shifts all the larger values up to make a space, and inserts into that correct position.


これはちょっと混乱しているかもしれませんが、ここでは、アルゴリズムがデータで何をするかを視覚的に可視化します.

整数の配列を移動するときは、それぞれの値を一度に1つ前の整数に比較し、最終的に適切な場所に挿入されるまで、それぞれの場所をスワップします.
我々は、データを介して動作するように2つのサブアレイでは、左側をソートされ、右側がソートされずに残っている.

どのように効率的ですか?


残念なことに、挿入ソートは、速いソート、ヒープソート、またはマージソートのようなより高度なアルゴリズムよりも大きなデータセットでは効率的ではありません.
プログラムを実行する簡単な
  • .
  • 小さなデータ・セットのために
  • 効率.
  • は、すでにほとんどソートされるデータセットのために適応的に効率的です.
  • は一定のO(1)スペースだけを取って、適所に機能します.
  • 挿入ソートの最悪の場合と平均ケース時間の複雑さはo(n 2)(2)

    どうやってそれを実装するの?


    今、我々は良い部分になっている!
    JavaScriptで挿入ソートを実装しているので、配列の要素をスワップするのに現代的なES 6 +構文を利用することになります.これは、我々が書く必要のあるコードの数を保つのを助けるでしょう.
    最終的なアルゴリズムは次のようになります.
    function insertionSort(array) {
      for (let i = 1; i < array.length; i++) {
        let j = i;
        while (j > 0 && array[j] < array[j - 1]) {
          [array[j - 1], array[j]] = [array[j], array[j - 1]];
          j--;
        }
      }
    return array;
    }
    
    さて、一歩一歩それを壊しましょう.
    まず最初に、私たちの関数、その戻り値(変更された配列)を宣言しましょう.
    function insertionSort(array) {
      for (let i = 1; i < array.length; i++) {
    
      }
    return array;
    }
    
    我々は、ループのために我々の全体の配列を単に繰り返すのをかなり予想できるようにこれを書いています.ここでの違いは、通常の0ではなくインデックス1で起動します.なぜなら、スワップが必要かどうかを確かめる前に、それぞれの要素を少なくとも比較するつもりだからです.0番目の要素に比較する前の要素がないので、スキップして1を開始します.
    次に、アレイを通るトラバースの第2のポインタを設定します.
    function insertionSort(array) {
      for (let i = 1; i < array.length; i++) {
        let j = i;
      }
    return array;
    }
    
    ポインタjはiの値に設定されています.なぜなら、forループの配列を通過したときに、既にソートされたサブ配列内の各値と比較するために後方に横切っている瞬間に2番目のwhileループを実装するからです.
    ループと、アルゴリズムの最終段階は、次のようになります.
    function insertionSort(array) {
      for (let i = 1; i < array.length; i++) {
        let j = i;
        while (j > 0 && array[j] < array[j - 1]) {
          [array[j - 1], array[j]] = [array[j], array[j - 1]];
          j--;
        }
      }
    return array;
    }
    
    これは多くの新しいコードです、それで、それのすべての3つの線が何をするかによって働きましょう.
  • 私たちは、Jが0より大きい間(それが配列の始めに達していないことを意味します)、そして、Array[J]の値が配列[J - 1]未満である間、消えるwhileループを実行します.これらの2つの条件は、ループが配列のすべての方法を通過し、開始要素が適切な場所に挿入されるまで値をスワップする(小さい値より前の要素).
  • 私たちはJavaScript ES 6構文を使用して、各要素を前に来る要素と入れ替え、開始要素を一度に1つのステップに移動させます.
  • 私たちはJの値を減少させます.したがって、次のループでは、私たちがさらに下に始めた同じ要素をまだ交換しています.
  • そして、それ!JavaScriptで挿入ソートアルゴリズムを実装しました.ああ!
    これはすべての多くを視覚化し、あなたの頭をラップするので、私はあなたが何を起こっているの本当の意味を得るためにループやポインタについて考えることをお勧め-一度クリックすると、それが良いのロックを持っているでしょうクリックします.私はそれが何をされているかを視覚化するのに大いに役立つと思うので、ここでこの役に立つアニメーションを再ペーストします

    あなたがこれまで来たならば、読書のためにとてもありがとう!私はこれが誰もが一般的にソートアルゴリズム、JavaScript、またはプログラミングの基礎についての学習に役立つことを願っています.
    私は今後のポストでより多くのソートアルゴリズムを通して作業を続行しますので、ご期待ください!