線性排序

介紹

  • 包含桶排序,計數排序,基數排序
  • 時間複雜度爲O(n)
  • 都不涉及元素之間的比較操做,是非基於比較的排序算法
  • 對排序數據的要求苛刻

桶排序

  • 核心思想:將要排序的數據分到幾個有序的桶裏,每一個桶裏的數據再單獨進行排序。桶內排完序以後,再把每一個桶裏的數據按照順序依次取出,組成的序列就是有序的了。
  • 使用條件:桶排序對要排序數據的要求是很是苛刻的。
    • 首先,要排序的數據須要很容易就能劃分紅m個桶,而且,桶與桶之間有着自然的大小順序。這樣每一個桶內的數據都排序完以後,桶與桶之間的數據不須要再進行排序。算法

    • 其次,數據在各個桶之間的分佈是比較均勻的。若是數據通過桶的劃分以後,有些桶裏的數據很是多,有些很是 少,很不平均,那桶內數據排序的時間複雜度就 不是常量級了。在極端狀況下,若是數據都被劃分到一個桶裏,那就退化爲O(nlogn)的排序算法了。數組

    • 桶排序比較適合用在外部排序中。所謂的外部排序就是數據存儲在外部磁盤中,數據量比較大,內存有限,沒法將數據所有加載到內存中。 指針

計數排序

  • **核心思想:**實際上是桶排序的一種特殊狀況。當要排序的n個數據,所處的範圍並不大的時候,好比最大值是k,咱們就能夠把數據劃分紅k個桶。每一個桶內的數據值都是相同的,省掉了桶內排序的時間。
  • **案例:**考生的滿分是900分,最小是0分,這個數據的範圍很小,因此咱們能夠分紅901個桶,對應分數從0分到900分。根據考生的成績,咱們將這50萬考生劃分到 這901個桶裏。桶內的數據都是分數相同的考生,因此並不須要再進行排序。咱們只須要依次掃描每一個桶,將桶內的考生依次輸出到一個數組中,就實現了50萬考 生的排序。由於
    只涉及掃描遍歷操做,因此時間複雜度是O(n)。
  • 使用條件:
    • 只能用在數據範圍不大的場景中,若數據範圍k比要排序的數據n大不少,就不適合用計數排序排序

    • 只能給非負整數排序 內存

基數排序

  • 核心思想(以排序10萬個手機號爲例子):字符串

    • 比較兩個手機號碼a,b的大小,若是在前面幾位中a已經比b大了,那後面幾位就不用看了。class

    • 藉助穩定排序算法的思想,能夠先按照最後一位來排序手機號碼,而後再按照倒數第二位來從新排序,以此類推,最後按照第一個位從新排序。遍歷

    • 通過11次排序後,手機號碼就變爲有序的了。數據

    • 每次排序有序數據範圍較小,可使用桶排序或計數排序來完成。
      di

  • 使用條件:

    • 要求數據能夠分隔獨立的"位"來比較;
    • 位之間有遞進關係,比較兩個數,咱們只須要比較高位,高位相同的再比較低位。
    • 每一位的數據範圍不能太大,要能夠用線性排序,不然基數排序的時間複雜度沒法作到O(n)。

問題

  • 假設咱們如今須要對D,a,F,B,c,A,z這個字符串進行排序,要求將其中全部小寫字母都排在大寫字母的前面,但小寫字母內部和大寫字母內部不要求有 序。好比通過排序以後爲a,c,z,D,F,B,A,這個如何來實現呢?若是字符串中存儲的不只有大小寫字母,還有數字。要將小寫字母的放到前面,大寫字母 放在最後,數字放在中間,不用排序算法,又該怎麼解決呢?

  • 解答: 用兩個指針a,b:a指針從頭開始日後遍歷,遇到大寫字母就停下,b從後往前遍歷,遇到小寫字母就停下,交換a,b指針對應的元素;重複如上過程,直到a.b指針相交。

  • 對於小寫字母放前面,數字放中間,大寫字母放後面,能夠先將數據分爲小寫字母和非小寫字母兩大類,進行如上交換後再在非小寫字母區間內分爲數字和大寫字母作一樣處理

相關文章
相關標籤/搜索