国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

用 JavaScript 實(shí)現(xiàn)鏈表操作 - 06 Insert Sort

doodlewind / 1895人閱讀

摘要:需求實(shí)現(xiàn)一個(gè)函數(shù)對(duì)鏈表進(jìn)行升序排列插入排序。關(guān)于插入排序插入排序的介紹可以看,大體邏輯為建立一個(gè)新的空鏈表。遍歷完成,返回新鏈表。代碼如下總結(jié)因?yàn)橛猩蟼€(gè)的函數(shù)的幫助,這個(gè)插入排序?qū)崿F(xiàn)起來(lái)非常簡(jiǎn)單。

TL;DR

2016 年末最后一篇,對(duì)鏈表進(jìn)行插入排序。系列目錄見(jiàn) 前言和目錄 。

需求

實(shí)現(xiàn)一個(gè) insertSort() 函數(shù)對(duì)鏈表進(jìn)行升序排列(插入排序)。實(shí)現(xiàn)過(guò)程中可以使用 上一個(gè) kata 中的 sortedInsert() 函數(shù)。insertSort() 函數(shù)接受鏈表頭為參數(shù)并返回排序后的鏈表頭。

var list = 4 -> 3 -> 1 -> 2 -> null
insertSort(list) === 1 -> 2 -> 3 -> 4 -> null

如果傳入的鏈表為 null 或者只有一個(gè)節(jié)點(diǎn),就原樣返回。

關(guān)于插入排序

插入排序的介紹可以看 Wikipedia ,大體邏輯為:

建立一個(gè)新的空鏈表。

依次遍歷待排序的鏈表節(jié)點(diǎn),挨個(gè)插入新鏈表的合適位置,始終保持新鏈表是已排序的。

遍歷完成,返回新鏈表。

觀察這段邏輯不難發(fā)現(xiàn),第二個(gè)步驟其實(shí)就是上個(gè) kata 中 sortedInsert 做的事情 -- 把節(jié)點(diǎn)插入一段已排序的鏈表的合適位置。在此之上稍微包裝一下就可以實(shí)現(xiàn) insertSort

遞歸版本

首先我們記住兩個(gè)函數(shù)的表達(dá)的意思:

insertSort 返回鏈表的排序版本。

sortedInsert 把節(jié)點(diǎn)插入一個(gè)已排序鏈表的合適位置,并返回修改后的鏈表(也是已排序的)。

然后我們用遞歸的思路描述 insertSort 邏輯,應(yīng)該是先把原鏈表的第一個(gè)節(jié)點(diǎn)插入某個(gè)已排序的鏈表的合適位置,這段邏輯可以用 sortedInsert(someList, head.data) 表達(dá)。而這個(gè) “某個(gè)已排序的鏈表” ,我們需要它包含除了 head 之外其他的所以節(jié)點(diǎn),這個(gè)鏈表可以用 insertSort(head.next) 來(lái)表達(dá)。

整理后的代碼如下:

function insertSort(head) {
  if (!head) return null
  return sortedInsert(insertSort(head.next), head.data)
}
循環(huán)版本

循環(huán)版本是最接近算法描述的版本,所以不多贅述。代碼如下:

function insertSort(head) {
  for (var sortedList = null, node = head; node; node = node.next) {
    sortedList = sortedInsert(sortedList, node.data)
  }
  return sortedList
}
總結(jié)

因?yàn)橛猩蟼€(gè) kata 的函數(shù)的幫助,這個(gè)插入排序?qū)崿F(xiàn)起來(lái)非常簡(jiǎn)單。遞歸版本再次體現(xiàn)了聲明式編程的優(yōu)勢(shì)。有時(shí)候能表達(dá)某種數(shù)據(jù)的不只是變量,也可以是函數(shù)。只要我們發(fā)現(xiàn)表達(dá)合適邏輯的函數(shù),實(shí)現(xiàn)過(guò)程就會(huì)非常簡(jiǎn)單。

算法相關(guān)的代碼和測(cè)試我都放在 GitHub 上,如果對(duì)你有幫助請(qǐng)幫我點(diǎn)個(gè)贊!

參考資料

Codewars Kata
GitHub 的代碼實(shí)現(xiàn)
GitHub 的測(cè)試

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86739.html

相關(guān)文章

  • JavaScript 實(shí)現(xiàn)鏈表操作 - 前言和目錄

    摘要:我打算寫(xiě)一個(gè)鏈表操作的系列,來(lái)自的系列,實(shí)現(xiàn)語(yǔ)言是。通過(guò)自己實(shí)現(xiàn)一個(gè)鏈表和常用操作,可以加深理解這類(lèi)數(shù)據(jù)結(jié)構(gòu)的優(yōu)缺點(diǎn)。鏈表經(jīng)常用來(lái)訓(xùn)練指針操作,雖然這只對(duì)適用,但等高級(jí)語(yǔ)言中控制引用的思路其實(shí)也差不多。 TL;DR 我打算寫(xiě)一個(gè)鏈表操作的系列,來(lái)自 Codewars 的 Linked List 系列 kata ,實(shí)現(xiàn)語(yǔ)言是 JavaScript 。這篇是開(kāi)篇,簡(jiǎn)單描述了一下我寫(xiě)這個(gè)的目...

    BetaRabbit 評(píng)論0 收藏0
  • Javascript的數(shù)據(jù)結(jié)構(gòu)與算法(一)

    摘要:對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回改函數(shù)會(huì)返回的項(xiàng)組成的數(shù)組。將所有的數(shù)組元素鏈接成一個(gè)字符串。數(shù)組合并方法可以向一個(gè)數(shù)組傳遞數(shù)組對(duì)象或是元素。通過(guò)棧實(shí)現(xiàn)對(duì)正整數(shù)的二進(jìn)制轉(zhuǎn)換。源碼地址的數(shù)據(jù)結(jié)構(gòu)與算法一源碼 1數(shù)組 1.1方法列表 數(shù)組的常用方法如下: concat: 鏈接兩個(gè)或者更多數(shù)據(jù),并返回結(jié)果。 every: 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true...

    VioletJack 評(píng)論0 收藏0
  • Python_數(shù)據(jù)結(jié)構(gòu)與算法

    摘要:什么是數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)的組織結(jié)構(gòu)方式一組數(shù)據(jù)如何存儲(chǔ),基本數(shù)據(jù)類(lèi)型,,的封裝算法與數(shù)據(jù)結(jié)構(gòu)的區(qū)別數(shù)據(jù)結(jié)構(gòu)只是靜態(tài)的描述了數(shù)據(jù)元素之間的關(guān)系。高效的程序需要在數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上設(shè)計(jì)和選擇算法。 數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ) 什么是數(shù)據(jù)結(jié)構(gòu)和算法:兵法,計(jì)算的方法。算法是獨(dú)立存在的一種解決問(wèn)題的方法和思想。 算法的特征: 輸入:算法具有0個(gè)或多個(gè)輸入 輸出:算法至少有1個(gè)或多個(gè)輸出 有窮性:算法在有限的...

    Kylin_Mountain 評(píng)論0 收藏0
  • [ JavaScript ] 數(shù)據(jù)結(jié)構(gòu)與算法 —— 鏈表

    摘要:每個(gè)元素由一個(gè)存儲(chǔ)元素本身的節(jié)點(diǎn)和一個(gè)指向下一個(gè)元素的引用也稱(chēng)指針或鏈接組成。相對(duì)于傳統(tǒng)的數(shù)組,鏈表的一個(gè)好處在于,添加或移除元素的時(shí)候不需要移動(dòng)其他元素。然而,鏈表需要使用指針,因此實(shí)現(xiàn)鏈表時(shí)需要額外注意。 本篇主要有三部分 什么是鏈表 鏈表的實(shí)現(xiàn) 鏈表的變種 源碼地址:https://github.com/yhtx1997/S... 另外,今天2019年2月18日上午發(fā)現(xiàn) 20...

    wfc_666 評(píng)論0 收藏0
  • JavaScript 實(shí)現(xiàn)鏈表操作 - 15 Merge Sort

    摘要:需求實(shí)現(xiàn)函數(shù)進(jìn)行歸并排序。解法歸并排序的運(yùn)行方式是,遞歸的把一個(gè)大鏈表切分成兩個(gè)小鏈表。切分到最后就全是單節(jié)點(diǎn)鏈表了,而單節(jié)點(diǎn)鏈表可以被認(rèn)為是已經(jīng)排好序的。這時(shí)候再兩兩合并,最終會(huì)得到一個(gè)完整的已排序鏈表。用把排好序的兩個(gè)鏈表合并起來(lái)。 TL;DR 對(duì)鏈表進(jìn)行歸并排序,系列目錄見(jiàn) 前言和目錄 。 需求 實(shí)現(xiàn)函數(shù) mergeSort() 進(jìn)行歸并排序。注意這種排序法需要使用遞歸。在 fr...

    X_AirDu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<