非比較排序--基數排序實現給字符串數組排序

1.計數排序的侷限性



    前面學習了計數排序,能夠實現O(n+k)的時間複雜度,可是他有很大的侷限性,最大的問題就是若是最大值和最小值之間相差太大的話,那麼會浪費掉很大的空間,好比要排序{1,10000,99,64,120}咱們能夠根據以前的計算公式最大值減去最小值加一獲得計數數組的長度,那麼計數數組長度就應該是10000,可是實際上咱們只存放了5個數據,中間浪費了極大的空間,因此在使用計數排序時,應該根據本身的實際狀況來決定。java

    好比咱們要對電話號碼進行一個排序,顯然用計數排序是很浪費空間的,同時由於時間複雜度爲O(n+k),可是n太大時,實際上他不必定比快速排序或者歸併排序要快



2.基數排序



    什麼是基數排序呢?基數排序和計數排序都是桶排序的一種思想,基數是一種關鍵字排序,例如咱們有這樣的一組數據{421,326,266,157,222,414}咱們首先拿到每個數的最後一位,也就是個位,而後進行排序,排序好後再取出十位進行排序,最後拿出百位來進行排序便可,而其中咱們每次取的位就是對關鍵字的操做。算法





    ps:須要注意的是咱們第一次根據個位排序時操做的是原數組,而根據十位排序的時候是在以前個位排好的基礎上進行排序,同理百位則是對十位排好後的進行排序。數組


    看到這兒聰明的你確定會問,若是位數不一致怎麼辦?好比有的是3位數,有的是4位數,甚者有可能還有2位數以及1位數,其實這個很好解決咱們只須要找到最大的那個數,而後根據最大的那個數來決定排幾回,其他不足的在前面添0,好比最大222,其中又有1位數的,2位數的,那麼就在2位數前面加一個0,而1位數則在前面加2個0便可。


java代碼實現以下微信




    實際上咱們這個代碼已經實現了自動加0的功能,咱們用Math.pow(10,i)來產生10的i平方,而後拿到原數組中的值除以獲得的平方數再求餘10,若是是1除以1000是0,再用0取餘10因此仍是0,因此會自動補0。app



2.基數排序時間空間複雜度



    咱們來看看時間複雜度和空間複雜度,實際上找出最大數的位數爲多少位,這一步應該是在外面計算好了傳遞進來的,他並不屬於基數排序裏面的。less

    

    最外層一共循環了d次,其中d就是咱們最大數的位數,而循環體內咱們對原數組遍歷了2次,因此是2n,而計數數組執行了一次就是k,也就是O(d*(2n+k)),而後咱們去掉一個常數階,能夠獲得時間複雜度爲O(d*(n+k)),那空間複雜度又是多少呢?根據咱們寫的代碼,咱們一共定義了一個計數數組和一個結果數組因此是O(n+10),而後去掉一個常數階能夠獲得空間複雜度爲O(n)。且基數排序是一個穩定的排序算法。編輯器



2.基數排序字符串排序



    如何用基數排序實現對字符串排序呢?咱們仍是使用一樣的方式例如字符串數{"abc","def","sxf","sss","cbh"},咱們拿到最後一位放入對應的位置,好比abc,當咱們拿到c時這個時候因爲是字符串你是根本不知道放那個位置的,因此咱們能夠將他變成char的字符,因爲c字符對應的ASCll是99,因此咱們存放在99的位置就行,固然若是字符串位數不一致,同理咱們能夠在前面補一個比A的ASCll還小的值便可。字符串排序重點就是要藉助ASCll來實現學習



Java代碼實現以下spa









本文分享自微信公衆號 - 大貓的Java筆記(damaoJava)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。.net

相關文章
相關標籤/搜索