排序算法(下)

復(fù)習(xí)任意長度的數(shù)組排序

let sort = (numbers) => {
  if(numbers.length > 2){
    let index = minIndex(numbers)
    let min = numbers[index]
    numbers.splice(index, 1)
    return [min].concat(sort(numbers))  }else{
    return numbers[0]<numbers[1] ? numbers :
           numbers.reverse()
  }
}

所有遞歸都可以改寫成循環(huán)
目前的minIndex

let minIndex = (numbers) => {
  numbers.indexOf(min(numbers))
let min = (numbers) => {
  return min(
    [numbers[0], min(numbers.slice(1))]
  )
}

寫為循環(huán)

let minIndex = (numbers) => {
  let index = 0
  for(let i=1; i<numbers.length; i++){
    if(numbers[i] < numbers[index]){
      index = i
    }
  }
  return index
}

選擇排序

每次找到最小的數(shù)放前面刻炒,然后對(duì)后面的數(shù)做同樣的事情

let swap = (array,i,j) => {
    let temp = array[i]
    array[i] = array[j]
    array[j] = temp
}
let minIndex = (numbers) => {
    let index = 0
    for(let i=1;i<numbers.length;i++){
        if(numbers[i] < numbers[index]){
            index = i
        }
    }
    return index
}
let sort = (numbers) => {
    for(let i=0; i< numbers.length -1; i++){
        let index = minIndex(numbers.slice(i))+i  //為什么要加i,因?yàn)閟lice以后下標(biāo)從0開始計(jì)嫁审,所以要把slice掉的下標(biāo)加回來
        if(index!==i){swap(numbers, index, i)}
    }
    return numbers
}

錯(cuò)誤地實(shí)現(xiàn) swap

let swap = (a, b) => {
    let temp = a
    a = b
    b = temp
}
swap(numbers[1], numbers[2])

你會(huì)發(fā)現(xiàn),numbers[1] 和 numbers[2] 的值原封不動(dòng)
因?yàn)?a b 是簡單類型,傳參的時(shí)候會(huì)復(fù)制值
而正確的 swap 中的 numbers 是對(duì)象,傳參復(fù)制地址
這是傳值 V.S. 傳址的區(qū)別

發(fā)現(xiàn)bug用console.log大法調(diào)試

let sort = (numbers) => {
    for(let i=0; i< numbers.length -1; i++){
    console.log(`----`) //這個(gè)log用于分割每一次循環(huán)
    console.log(`i: ${i}`)
    let index = minIndex(numbers.slice(i))+ i
    console.log(`index: ${index}`)
    console.log(`min: ${numbers[index]}`)
    if(index!==i){
        swap(numbers, index, i)
        console.log(`swap ${index}: ${i}`)
        console.log(numbers)
    }
}
  return numbers
}

快速排序

通俗的說就是以某某為基準(zhǔn)翅萤,小的去前面,大的去后面
重復(fù)這段話腊满,就能排序

let quickSort = arr => {
    if (arr.length <= 1) { return arr }
    let pivotIndex = Math.floor(arr.length / 2)  //Math.floor向下取整
    let pivot = arr.splice(pivotIndex, 1)[0]  //為什么要寫[0],如果不寫返回的是被切掉的數(shù)組套么,所以提取數(shù)組中的第0個(gè)培己,才是我們需要的數(shù)字
    let left = []
    let right = []
    for (let i =0; i < arr.length; i++){
        if (arr[i] < pivot) { left.push(arr[i])
        } else { right.push(arr[i]) }
    }
    return quickSort(left).concat(
        [pivot], quickSort(right)
    )
}

歸并排序

例如有一個(gè)數(shù)組[12, 3, 7, 21, 5, 9, 4, 6]
分成左邊一半排好序,右邊一半排好序
然后把左右兩邊合并(merge)起來
就變成了[3, 7, 12, 21]和[4, 5, 6, 9]
再分別比較兩個(gè)數(shù)組的第0項(xiàng)胚泌,最小的提出來排前面省咨,再把剩余的數(shù)組合并繼續(xù)比較第0項(xiàng)

let mergeSort = arr =>{
    let k = arr.length
    if(k===1){return arr}
    let left = arr.slice(0, Math.floor(k/2))
    let right = arr.slice(Math.floor(k/2))
    return merge(mergeSort(left),mergeSort(right))
}
let merge = (a, b) => {
    if (a.length === 0) return b
    if (b.length === 0) return a
    return a[0] > b[0] ?
        [b[0]].concat(merge(a, b.slice(1))) : 
        [a[0]].concat(merge(a.slice(1), b))
}

計(jì)數(shù)排序

用一個(gè)哈希表作記錄
發(fā)現(xiàn)數(shù)字 N 就記 N: 1,如果再次發(fā)現(xiàn) N 就加1
最后把哈希表的 key 全部打出來玷室,假設(shè) N: m零蓉,那么 N 需要打印 m 次

let countSort = arr =>{
    let hashTable = {}, max = 0, result = []
    for(let i=0; i<arr.length; i++){
        if(!(arr[i] in hashTable)){
            hashTable[arr[i]] = 1
        } else {
            hashTable[arr[i]] += 1
        }
        if(arr[i] > max) {max = arr[i]}
    }
    for(let j=0; j<=max; j++){
        if(j in hashTable){
            for(let i =0; i<hashTable[j]; i++){
                result.push(j)
            }
        }
    }
    return result
}

其他的排序算法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市穷缤,隨后出現(xiàn)的幾起案子敌蜂,更是在濱河造成了極大的恐慌,老刑警劉巖津肛,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件章喉,死亡現(xiàn)場離奇詭異,居然都是意外死亡快耿,警方通過查閱死者的電腦和手機(jī)囊陡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掀亥,“玉大人,你說我怎么就攤上這事妥色√禄ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵嘹害,是天一觀的道長撮竿。 經(jīng)常有香客問我,道長笔呀,這世上最難降的妖魔是什么幢踏? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮许师,結(jié)果婚禮上房蝉,老公的妹妹穿的比我還像新娘。我一直安慰自己微渠,他們只是感情好搭幻,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逞盆,像睡著了一般檀蹋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上云芦,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天俯逾,我揣著相機(jī)與錄音贸桶,去河邊找鬼。 笑死桌肴,一個(gè)胖子當(dāng)著我的面吹牛刨啸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播识脆,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼设联,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了灼捂?” 一聲冷哼從身側(cè)響起离例,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悉稠,沒想到半個(gè)月后宫蛆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡的猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年耀盗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卦尊。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叛拷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岂却,到底是詐尸還是另有隱情忿薇,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布躏哩,位于F島的核電站署浩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扫尺。R本人自食惡果不足惜筋栋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望正驻。 院中可真熱鬧弊攘,春花似錦、人聲如沸拨拓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渣磷。三九已至婿着,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竟宋。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工提完, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丘侠。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓徒欣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜗字。 傳聞我的和親對(duì)象是個(gè)殘疾皇子打肝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Get Started ? 選擇排序○ 遍歷○ 遞歸? 快速排序○ 每次取中間項(xiàng),小左右大? 歸并排序○ 左右兩邊...
    茜Akane閱讀 214評(píng)論 0 0
  • 排序動(dòng)圖鏈接挪捕,自行查找粗梭。https://visualgo.net/zh/sorting 快速排序 快速排序可能是應(yīng)...
    無業(yè)大學(xué)生閱讀 397評(píng)論 0 0
  • 什么是算法 高德納在《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》里對(duì)算法的歸納:書籍推薦:《數(shù)據(jù)結(jié)構(gòu)與算法分析》 輸入:一個(gè)算法必須有零...
    Tuuu閱讀 389評(píng)論 0 0
  • 十大經(jīng)典算法排序總結(jié)對(duì)比一張圖概括,主流排序算法概覽: 名詞解釋:n: 數(shù)據(jù)規(guī)模k:“桶”的個(gè)數(shù)In-place:...
    飛菲fly閱讀 636評(píng)論 0 2
  • 插入排序 借用《算法導(dǎo)論》里的例子级零,就是我們打牌的時(shí)候断医,每新拿一張牌都會(huì)把它按順序插入,這奏纪,其實(shí)就是插入排序鉴嗤。 齊...
    碼農(nóng)田小齊閱讀 187評(píng)論 0 0