之前想寫字符子串查找來著一直沒有時間
前兩天搞了個多key 的排序就看了golang的排序算法?
源碼在 sort/sort.go 文件
實現(xiàn)了兩種排序一種快速排序 為不穩(wěn)定的排序 一種是穩(wěn)定的排序
什么叫做不穩(wěn)定排序
為了實排序需要自己定義比較原則椭住,獲取長度函數(shù)等
go已經(jīng)內(nèi)部實現(xiàn)了int,float等類型的排序,不需要自己定義less等函數(shù)了
主要排序?qū)崿F(xiàn)在 quicksort 函數(shù)和stable 函數(shù) 一個是快速排序但是不穩(wěn)定的镇匀,一個是穩(wěn)定排序
在被排序?qū)ο箝L度>12 的情況下用的是先進行局部快排,在深度等于0 的時候再進行堆排序(這個時候每個堆應(yīng)該是大致有序的吧)岩馍,在長度小于12 的情況下先進行一輪步長為6 的希爾排序晋涣,在進行插入排序
用的排序算法都是我們?nèi)粘=佑|的 扮叨,有的新鮮的就是在doPivot() 這個函數(shù)選擇快排的Pivot 有點技巧 姜钳,要取得一個好的中間值坦冠,又盡量進行少次的比較,go 用的方法是 Tukey's Ninther?
關(guān)于這個?Tukey's Ninther? 有個鏈接可以看下
John Tukey's median of medians | ninther
在長度小于12 直接進行插入排序或者在快排幾輪基本有序的情況下進行插入排序哥桥,插入排序在基本有序的情況下可以達到線性的速度
穩(wěn)定排序
使用歸并算法排序? 看了個大概辙浑,后面有時間再看下?
總結(jié): golang 排序雖然用的都是我們常見的算法,但是考慮的非常多拟糕,也非常細致(比如說防止過深的遞歸了之類的)判呕,大神就是大神,各種算法的論文送滞,變種侠草,優(yōu)劣,類比都如數(shù)家珍犁嗅,感覺自己就是僅僅知道這個算法边涕,會用,會實現(xiàn)而已褂微,雖然我和大神差的很遠功蜓,但是我還是要一點一點縮短我們之間的距離,哪怕是一點宠蚂,也要進步(o(* ̄︶ ̄*)o)