計數排序vs基數排序vs桶排序

從計數排序說起

計數排序是一種非基于元素比較的排序算法,而是將待排序數組元素轉化為計數數組的索引值,從而間接使待排序數組具有順序性。

計數排序的實現一般有兩種形式:基于輔助數組和基于桶排序。

基于輔助數組

整個過程包含三個數組:待排序數組A、計數數組B和輸出數組C。

簡單來說,就是通過統計待排序數組A中元素不同值的分布直方圖,生成計數數組B,然后計算計數數組B的前綴和(此步操作可以看成計算待排序數組A中每個元素的位置信息),最后通過逆序循環將元素對應賦值到輸出數組C中,輸出數組C即是最終排序結果。

基于桶排序

其實就是用桶排序來維護穩定性,因為在每個桶中的元素是以隊列結構排序的,可以維護元素的順序。

主要步驟:

  1. 按元素的最大健值與最小健值之差來創建指定數量的桶,并在每個桶中創建一個隊列。
  2. 按順序遍歷待排序數組,將它們放到對應桶的隊列中。
  3. 按桶編號順序進行遍歷,將每個桶中隊列按順序輸出回原數組中。

計數排序的不足

可以看到輔助數組的長度和桶的數量由最大值和最小值決定,假如兩者之差很大,而待排序數組又很小,那么就會導致輔助數組或桶大量浪費。

基數排序

基數排序改善了計數排序,簡單來說,基數排序算法就是將整數或字符串切分成不同的數字或字符,然后按對應位置的數或字符分別進行比較,這樣就能將輔助數組或桶的數量降低到一個較小的值,經過多輪排序后得到最終的排序結果。

比如下面對于十進制的數值比較,只需要10個桶即可,但要保證每個桶能放得進所有元素。

第一階段:針對個位數將元素放到對應的桶中。

第二階段:針對十位數將元素放到對應的桶中。

第三階段:針對百位數將元素放到對應的桶中。

最終按照桶順序輸出得到排序結果。

桶排序

桶排序是改善計數排序的方法之一,其基本思想是將待排序數組分配到若干個桶內,然后每個桶內再各自進行排序,桶內的排序可以使用不同的算法,比如插入排序或快速排序,屬于分治法。每個桶執行完排序后,最后依次將每個桶內的有序序列拿出來,即得到完整的排序結果。

待排序數組的最大元素與最小元素分別為19和1,那么總的范圍區間可定義為[0,19],假設用4個桶,則桶的區間分別為[0,4][5,9][10,14][15,19]。可以看到桶的數量可以控制在很小的范圍內,而且桶的容量大小可以動態擴充。

按照值將元素放到對應桶內。

按照桶順序將元素依次輸出得到排序結果。

總結

  • 基數排序和桶排序可以看成是計數排序的泛化版本,使用了某些措施優化排序過程。
  • 在桶排序中當桶的個數取最大值(max-min+1)的時候,就變成了計數排序,所以計數排序時桶排序的一種特例。
  • 基數排序可以看做是多輪桶排序,基數排序以有效位的角度,每個有效位都進行一輪桶排序。
  • 當用最大值作為基數時,基數排序就退化成了計數排序。

-------------推薦閱讀------------

我的開源項目匯總(機器&深度學習、NLP、網絡IO、AIML、mysql協議、chatbot)

為什么寫《Tomcat內核設計剖析》

2018匯總數據結構算法篇

2018匯總機器學習篇

2018匯總Java深度篇

2018匯總自然語言處理篇

2018匯總深度學習篇

2018匯總JDK源碼篇

2018匯總Java并發核心篇

2018匯總讀書篇


跟我交流,向我提問:

歡迎關注:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536945.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536945.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多線程中ThreadLocal的使用

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

mysql 查看所有表的引擎_MySQL查看數據庫、表的占用空間大小以及某個庫中所有表的引擎類型...

本文章來給大家介紹一些常用的MySQL查看數據庫、表的占用空間大小sql命令吧,希望此教程 對各位同學會有所幫助。查看各庫的大小代碼如下復制代碼SELECT SUM(DATA_LENGTH)SUM(INDEX_LENGTH) FROM information_schema.tables WHERE TABLE_SCHEMAdatabase_name;結果是以…

Fusion組件庫是如何支持多語言能力的

隨著國際化發展,多語言的需求越來越常見,單一的語言已經遠不能滿足需求了。作為一個組件庫,支持多語言也是基本能力。 多語言功能的本質其實是文本的替換,一個詞匯“OK”,在英文語境下是“OK”,日語語境下是…

mysql 存儲過程 replace_mysql replace存儲過程

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云數據庫專家保駕護航,為用戶…

注解版poi操作工具

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

Kali Linux 2019.1 發布,Metasploit 更新到 5.0 版本

百度智能云 云生態狂歡季 熱門云產品1折起>>> Kali Linux 2019.1 發布了,Kali 前身 BackTrack,它是一個基于 Debian 的 Linux 發行版,主要用于信息安全行業,其包含了一系列安全、滲透測試和取證工具。此版本 Linux 內核…

peewee mysql_scrapy中利用peewee插入Mysql

前兩天老大布置一個任務,說爬下來的數據要存入數據庫中,丟給我一個peewee,說用這個。當時的我兩眼一抹黑,這是個什么東西呀,我知道scrapy的數據存入數據庫是在pipelines中進行設置但是peewee是什么東西呢。經過兩天不懈…

Java版數據結構與算法——線性表

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

基于 CODING 的 Spring Boot 持續集成項目

本文作者:CODING 用戶 - 廖石榮 持續集成的概念 持續集成(Continuous integration,簡稱 CI)是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每…

lvs mysql 端口_LVS配置及多端口服務配置

一、5、各主機IP地址:主機IP網關Client192.168.86.116RouterF0/0:192.168.x.xFo/1:192.168.xx.xxF0/1DirectorEth0:192.168.86.111/24(DIP)Eth0:1:192.168.86.254/32(VIP)F0/1Real 1Eth0:192.168.86.112/24(DIP)lo:1:192.168.86.254/32(VIP)F0/1Real 2Eth0:192.168.…

Mybatis組成部分

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

Stream流與Lambda表達式(一) 雜談

一、流 轉換為數組、集合 package com.java.design.java8.Stream;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;import java.util.A…

一年java工作經驗-面試總結

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

linux mysql python包_03_mysql-python模塊, linux環境下python2,python3的

---恢復內容開始---1、Python2 正常[rootIP ~]#pip install mysql-pythonDEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 wont be maintained after that date. A future version of pip will drop …

我的這套VuePress主題你熟悉吧

最近熬了很多個夜晚, 踩坑無數, 終于寫出了用VuePress驅動的主題. 只需體驗三分鐘,你就會跟我一樣,愛上這款主題. vuepress-theme-indigo-material, 已經發布到npm, 請客官享用~~ 介紹 vuepress-theme-indigo-material 的原主題是hexo-theme-indigo, git…

兩年Java工作經驗應該會些什么技術

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

centos 6 mysql 5.7.13 編譯安裝_Centos 6.5 下面 源碼編譯 安裝 Mysql 5.7.13

安裝軟件依賴包yum -y install gcc gcc-c ncurses ncurses-devel cmake下載軟件包cd /usr/local/srcwget https://downloads.mysql.com/archives/get/file/mysql-5.7.13.tar.gz --no-check-certificate下載 boost 庫,MySQL 5.7.5 開始Boost庫是必需的cd /usr/loca…

LeetCode 237. 刪除鏈表中的節點(Python3)

題目: 請編寫一個函數,使其可以刪除某個鏈表中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個鏈表 -- head [4,5,1,9],它可以表示為: 示例 1: 輸入: head [4,5,1,9], node 5 輸出: [4,1,9…

使用Uniapp隨手記錄知識點

使用uniapp隨手記錄知識點 1 組件內置組件擴展組件 2 vuex狀態管理使用流程mapState 輔助函數gettersMutation 1 組件 內置組件 內置組件內主要包含一些基礎的view button video scroll-view等內置基礎組件,滿足基礎場景 擴展組件 擴展組件是uniapp封裝了一些成…

一年Java經驗應該會些什么

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…