關於排序算法的隨手記

  • 遞歸實現排序算法還是棧實現排序算法都存在空間複雜度問題。

  • 另外就是插入排序對於原本已經有序的數組排序效率接近n,對於亂序的排序則反而接近n^2.希爾排序(步長排序)就是先通過步長將原數組分爲很多小組先調整出順序性,然後再最後進行插入排序。其利用的就是插入排序對有序數組效率高的性質來設計的。

  • 歸併排序也被叫做二叉樹排序,因爲他是完全二叉樹自底向上的排序過程。(有點像線段樹)

  • 快速排序,希爾排序,歸併排序3兄弟常常和堆排序做比較,因爲堆排適合處理大數據排序。而快排,希爾排,歸併排,都是處理小空間排序。
    這幾種排序都不穩定,但是都是高效排序。

  • 快排的不穩定在於它找一箇中位數的過程是隨機,所以爲了使快排能找個好的中位數,常常採用頭尾和中間3個數求平均值的方法,大概率能求得中位數的值。因此,快排也相對希爾排和歸併排受大衆喜歡。

  • 希爾排最節省內存,迭代即可。

  • 歸併排和快排需要棧空間。

  • 快排的核心疼點就是:中位數不好找,所以很多人爲了逼近中位數,玩出了很多花裏花俏的手法。

比如:隨機取3個元素的平均值(或者4個數,5個數也可以的…原理就是,賭平均值和中位數的方差不大。)

還有另一種玩法,就是用多叉樹遞歸來代替二叉樹遞歸,如果多叉樹和二叉樹都能找到一個穩定的中位數的話,那麼他們的時間複雜度是一樣的。

但是大部分情況下,多叉樹遞歸估計效果比較好,因爲容易找到中位數。就好像讓我們閉着眼睛切蛋糕,切一刀和切兩刀,很明顯切兩刀更容易劈中蛋糕。哈哈哈哈哈

而所謂的雙軸快排就是等價於3叉樹遞歸,利用的原理就是“劈兩刀更容易劈中蛋糕”。

這裏有一個問題,如果遞歸的深度變淺了,子節點變多了,性能會有什麼變化?

  • 堆排序穩定性比快排高,但是堆排有缺點,就是數據變換大,不利於CPU緩存,只能說快排對硬件友好罷了。

  • java的排序算法就有用到雙軸快排,準確的說java會對數組特點選擇多種排序算法:單軸快排(256小數組會用),歸併,雙軸快拍,雙變量插入排序(如果數組結構化比較好的話會用),都用到了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章