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