JavaScriptでチェーン操作を実現-06 Insert Sort


TL;DR
2016年末の最後の編にチェーンを挿入して並べ替えます.シリーズの目次は前文と目次に会ってください.
需要insertSort()関数によって、チェーンテーブルの昇順配置(挿入順序)が実現されます.実装中は、前のkataのsortedInsert()関数を使用することができます.insertSort()関数は、チェーンヘッダをパラメータとして受け取り、順序付けされたチェーンヘッダを返します.
var list = 4 -> 3 -> 1 -> 2 -> null
insertSort(list) === 1 -> 2 -> 3 -> 4 -> null
入ってきたチェーンがnullであるか、またはノードが一つしかない場合、そのまま戻ってきます.
挿入順序について
ランキングの紹介を挿入するとWikipediaが見られます.大体のロジックは次の通りです.
  • に新しい空チェーンが作られました.
  • は、順序付けされたチェーンノードを順次巡回し、新しいチェーンテーブルの適切な位置を次々に挿入し、常に新しいチェーンテーブルが順序付けられていることを維持する.
  • は完了し、新しいチェーンを返します.
  • この論理を見ると、第二のステップは、前のkataのsortedInsertがしたことである.ノードを並べ替えられたチェーンテーブルの適切な位置に挿入する.この上に少し包装すればinsertSortが実現できます.
    再帰版
    まず、二つの関数の表現の意味を覚えます.
  • insertSortは、チェーンの並べ替えバージョンを返します.
  • sortedInsertは、順序付けられたチェーンテーブルの適切な位置にノードを挿入し、修正されたチェーンテーブルを返します.
  • その後、私たちは再帰的な考え方でinsertSortの論理を説明し、最初に元のチェーンテーブルの第1のノードを順序付けられたチェーンテーブルの適切な位置に挿入するべきであり、この論理はsortedInsert(someList, head.data)で表現されてもよい.この「ある順序付けられたチェーンテーブル」は、head以外の他のノードを含む必要があります.このチェーンはinsertSort(head.next)で表現できます.
    整理したコードは以下の通りです.
    function insertSort(head) {
      if (!head) return null
      return sortedInsert(insertSort(head.next), head.data)
    }
    サイクルバージョン
    サイクルバージョンはアルゴリズムの説明に最も近いバージョンであるので、詳細は説明しない.コードは以下の通りです
    function insertSort(head) {
      for (var sortedList = null, node = head; node; node = node.next) {
        sortedList = sortedInsert(sortedList, node.data)
      }
      return sortedList
    }
    締め括りをつける
    前のkataの関数の助けがあるので、この挿入順序はとても簡単です.再帰的バージョンは、再度、ステートメントプログラミングの利点を体現している.あるデータを表現できるのは変数だけでなく、関数でもあります.適切な論理を表す関数を見つけさえすれば,実現過程は非常に簡単である.
    アルゴリズムに関するコードとテストは全部GitHubに置いています.もしあなたに助けがあれば、いい評価をお願いします.
    参考資料
    Codewars Kata GitHubのコードはGitHubのテストを実現します.