桶排序和基數排序

前言:

? ? ? ? 這篇文章,我們就來了解一些鮮為人知的排序,桶排序和基數排序。

桶排序:

桶排序的思想:

????????桶排序的思想就是把待排序的數盡量均勻地放到各個桶中,再對各個桶進行局部的排序,最后再按序將各個桶中的數輸出,即可得到排好序的數。

????????桶排序(Bucket Sort)又稱箱排序,是一種比較常用的排序算法。其算法原理是將數組分到有限數量的桶里,再對每個桶分別排好序(可以是遞歸使用桶排序,也可以是使用其他排序算法將每個桶分別排好序),最后一次將每個桶中排好序的數輸出。

????????首先確定桶的個數。因為桶排序最好是將數據均勻地分散在各個桶中,那么桶的個數最好是應該根據數據的分散情況來確定。首先找出所有數據中的最大值max和最小值min;

求桶的個數:?

????????根據max和min確定每個桶所裝的數據的范圍 size,有size = (max - min) / n + 1,n為數據的個數,需要保證至少有一個桶,故而需要加個1;

求桶數據范圍差值:

????????求得了size即知道了每個桶所裝數據的范圍,還需要計算出所需的桶的個數count,有
count?= (max - min) / size + 1,需要保證每個桶至少要能裝1個數,故而需要加個1;

桶的數據范圍:

????????求得了size和cnt后,即可知第一個桶裝的數據范圍為 [min, min + size),第二個桶為 [min + size, min + 2 * size),…,以此類推。

????????因此步驟2中需要再掃描一遍數組,將待排序的各個數放進對應的桶中。

對桶中的元素進行排序:?

????????對各個桶中的數據進行排序,可以使用其他的排序算法排序,例如快速排序;也可以遞歸使用桶排序進行排序;

統一排序:

? ? ? ? 最后將各個桶中排好序的數據依次輸出,最后得到的數據即為最終有序。

圖解:

接下來舉一個例子:

例如,待排序的數為:3, 6, 9, 1

1)求得 max = 9,min = 1,n = 4
size = (9 - 1) / n + 1 = 3
count = (max - min) / size + 1 = 3

2)由上面的步驟可知,共3個桶,每個桶能放3個數,第一個桶數的范圍為 [1, 4),第二個[4, 7),第三個[7, 10)
掃描一遍待排序的數,將各個數放到其對應的桶中,放完后如下圖所示:

3)對各個桶中的數進行排序,得到如下圖所示:

4)依次輸出各個排好序的桶中的數據,即為:1, 3, 6, 9
可見,最終得到了有序的排列。

代碼:?

    public static void barrelSort(int[] nums) {int n = nums.length;int max = 0, min = 0;//找出最大最小值for (int i = 0; i < n; i++) {if (nums[i] > max) {max = nums[i];}if (nums[i] < min) {min = nums[i];}}int size = (max - min) / n + 1;//獲取桶的個數,至少保證有一個int count = (max - min) / size + 1;//得知每個桶中存取數據范圍(相當于差值)List<Integer>[] barrel = new List[size];//初始化每個桶for (int i = 0; i < size; i++) {barrel[i] = new ArrayList<>();}//掃描一遍數組,把數放在對應的桶里面for (int i = 0; i < n; i++) {int index = (nums[i] - min) / size;//定位第幾個桶barrel[index].add(nums[i]);}//對同種每個數據進行排序,這里使用快排for (int i = 0; i < size; i++) {barrel[i].sort(null);//默認就是升序排序,不需要使用比較器}//一次出桶int index = 0;for (int i = 0; i < size; i++) {for (int j = 0; j < barrel[i].size(); j++) {nums[index++] = barrel[i].get(j);}}}public static void main(String[] args) {int[] nums = {19,27,35,43,31,22,54,66,78};barrelSort(nums);for (int i = 0; i < nums.length; i++) {System.out.print(nums[i] + " ");}}
}

時間復雜度分析:?

最好時間復雜度:O(n + k)

????????其中k為桶的個數。即當數據是均勻分散排列的,那么每個桶分到的數據個數都是一樣的,這個步驟需要O(k)的時間復雜度,在對每個桶進行排序的時候,最好情況下是數據都已經是有序的了,那么最好的排序算法的時間復雜度會是O(n),因此總的時間復雜度是?O(n + k)?。

最壞時間復雜度:O(n^2)

????????當對每個桶中的數據進行排序的時候,所使用的排序算法,最壞情況下是O(n^2).

平均時間復雜度:O(n)

基數排序:

基數排序的思想:

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

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

相關文章

AI Agent: Agent框架+7個實例

何謂Agent Agent 作為一種新興的人工智能技術&#xff0c;正在受到越來越多的關注。要說清楚什么是 Agent&#xff0c;先得看看人工智能的本質是什么。 人工智能這個名稱來自它試圖通過計算機程序或機器來模擬、擴展和增強人類智能的 一些方面。在這個定義中&#xff0c;“人…

C# WPF入門學習(四)—— 按鈕控件

上期介紹了WPF的實現架構和原理&#xff0c;之后我們開始來使用WPF來學習各種控件。 一、嘗試插入一個按鈕&#xff08;方法一&#xff09; 1. VS2019 在界面中&#xff0c;點擊工具欄中的視圖&#xff0c;在下拉菜單中選擇工具箱。 至于編譯器中的視圖怎么舒服怎么來布置&am…

Cocos Creator 幀動畫播放組件制作詳解

Cocos Creator 是一個強大的游戲開發工具&#xff0c;提供了豐富的功能和組件&#xff0c;其中幀動畫播放組件是游戲開發中常用的組件之一&#xff0c;通過幀動畫播放組件可以實現角色動畫、特效動畫等效果。本文將詳細介紹如何使用 Cocos Creator 制作幀動畫播放組件&#xff…

infoq學習筆記-云原生網關當道,三大主流廠商如何“競 技”?

注基礎組件的質量&#xff0c;這些基礎組件是用戶看不到的。這些組件包括代碼質量、自動化的CI/CD、端對端測試、混沌測試等。在APISIX中&#xff0c;我們內置了大 量的測試案例代碼&#xff0c;包括單元測試、E2E測試、混沌測試&#xff0c;以及一些基準測試等&#xff0c;從而…

沈陽師范大學文學院副教授傅贏

女&#xff0c;生于1971年6月&#xff0c;遼寧遼陽人&#xff0c;1995年6月畢業于沈陽師范學院中文系漢語言文學教育專業&#xff0c;2000年6月于東北師范大學獲中國現當代文學專業文學碩士學位&#xff0c;現為文學院漢語國際教育專業教師&#xff0c;副教授。 主要從事對外漢…

藍橋杯練習系統(算法訓練)ALGO-934 序列

資源限制 內存限制&#xff1a;256.0MB C/C時間限制&#xff1a;1.0s Java時間限制&#xff1a;3.0s Python時間限制&#xff1a;5.0s 問題描述 王神想要知道n的所有排列的逆序對數和&#xff0c;但是他覺得太水了&#xff0c;于是讓你算。 輸入格式 一行一個整數n 輸…

random和range

含義&#xff1a; random(1&#xff0c;10) 不包含10&#xff0c;用于生成隨機數。它可以生成浮點數或整數&#xff0c;取決于具體的使用方式。 range(0&#xff0c;1) 不包含1&#xff0c;用于生成一個整數序列。它可以生成一個指定范圍內的連續整數序列。 區別在于&#x…

Linux:Linux系統項目配置

linux高級 軟件安裝 rpm(redhat package manager)安裝 軟件已經按照redhat的包管理規范進行打包,使用rpm命令進行安裝,但包之間可能有依賴關系,因此不能自行解決庫依賴問題,比較麻煩 yum安裝 一種在線軟件安裝方式,本質上還是rpm安裝,自動下載安裝包并安裝,安裝過程中自動…

【MySQL精通之路】SQL優化(1)-查詢優化(23)-避免全表掃描

當MySQL使用全表掃描來解析查詢時&#xff0c;EXPLAIN的輸出在type列中顯示ALL。 這種情況通常發生在以下情況下&#xff1a; 該表非常小&#xff0c;因此執行全表掃描比查找關鍵字更快。這對于少于10行且行長較短的表來說很常見。 對于索引列&#xff0c;ON或WHERE子句中沒有…

服務器硬件全攻略:從入門到精通,全面解析服務器性能與穩定性!

服務器是計算機網絡中提供特定服務的計算機系統&#xff0c;其硬件配置和性能直接影響到整個網絡系統的運行效率和穩定性。作為一個資深的技術人員&#xff0c;本文將全面詳細地介紹服務器硬件基礎知識&#xff0c;包括介紹、命令或語法、主要作用以及使用方法等。 一、介紹 服…

Linux基礎(七):Linux 系統上的庫文件生成與使用

學過C語言我們知道&#xff0c;C語言有標準庫和自定義庫&#xff0c;這些方便了我們的實際開發&#xff0c;提供了已經實現好的函數接口&#xff0c;我們使用的時候&#xff0c;只需要引入頭文件即可&#xff0c;那具體的實現過程又是怎么樣的呢&#xff1f;我們又該如何實現我…

JS實現照片預覽

以下是一個簡單的JS代碼示例&#xff0c;用于實現照片預覽功能&#xff1a; <!DOCTYPE html> <html> <head><title>Photo Preview</title><script>function previewPhoto(event) {var reader new FileReader();reader.onload function(…

MySQL字符數據查詢拆分

MySQL字符數據查詢拆分 問題描述 數據表中某字段為特定單詞組字符串&#xff0c;特定字符分隔。 現有需求&#xff1a;在不影響原始數據的情況下&#xff0c;查詢顯示拆分后的單詞&#xff0c;方便后續對其進行后續操作。 演示 演示數據源 -- 測試表結構create table word_…

Java中創建不可變對象實現細節和例子

當我們在Java中創建不可變對象時&#xff0c;我們需要確保對象的狀態在創建之后不能被修改。以下是一些具體的實現細節和例子&#xff0c;展示了如何在Java中創建不可變對象。 實現細節 使用final關鍵字&#xff1a; 類定義前使用final關鍵字&#xff0c;表示該類不能被繼承&…

Mysql中的慢查詢

Mysql慢查詢的一些sql命令 慢查詢的默認事件為10秒 #注意&#xff1a;慢查詢一般是在調試階段開啟的&#xff0c;在開發階段中一般不會開啟&#xff0c;會對效率產生延誤 #查詢慢查詢是否開啟 show variables like %general%; #慢查詢時間設置 show variables like long_query…

【運維項目經歷|018】:Elasticsearch智能數據分析平臺項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 問題1&#xff1a;本次項目周期&#xff1f; 問題2&#xff1a;服務部署架構方式及數量和配置&…

【簡明指南:Python中的異常處理與穩健代碼設計】

文章目錄 前言異常處理基礎捕獲多種異常確保資源被釋放使用else子句自定義異常結論 前言 軟件開發過程中&#xff0c;保證代碼的穩健性和可靠性至關重要。異常處理是實現這一目標的關鍵技術之一。在Python編程中&#xff0c;合理地捕獲和處理異常不僅能提高程序的健壯性&#…

查找專利渠道

官方渠道 常規檢索 (cnipa.gov.cn)https://pss-system.cponline.cnipa.gov.cn/conventionalSearch 佰騰網 佰騰網 - 查專利就上佰騰網_佰騰全球專利搜索平臺_商標查詢平臺_企業工商信息查詢平臺 (baiten.cn)https://www.baiten.cn/

NLP(19)--大模型發展(3)

前言 僅記錄學習過程&#xff0c;有問題歡迎討論 大模型訓練相關知識&#xff1a; 問題&#xff1a; 數據集過大&#xff0c;快速訓練模型過大&#xff0c;gpu跑不完 方案&#xff1a; 數據并行訓練&#xff1a; 復制數據&#xff08;batch_size&#xff09;到多個gpu&…

簡述vue-router的動態路由

動態路由 addRoute 是 Vue Router 中的一個功能&#xff0c;它允許你在運行時動態地向路由表添加路由規則。這在一些需要基于用戶行為或異步數據加載路由的場景中非常有用。以下是對 addRoute 功能的詳細解釋和使用示例&#xff1a; 1. 動態路由的概念 動態路由是指在應用運行…