Python 實現桶排序詳解

1. 核心原理

桶排序是一種非比較型排序算法,通過將數據分配到多個“桶”中,每個桶單獨排序后再合并。其核心步驟包括:

  • 分桶:根據元素的范圍或分布,將數據分配到有限數量的桶中。
  • 桶內排序:對每個非空桶內的數據進行排序(通常使用插入排序等簡單算法)。
  • 合并結果:按桶的順序將數據合并回原數組。

關鍵特點

  • 適用于數據分布均勻且范圍已知的場景。
  • 時間復雜度依賴數據分布,理想情況下接近線性。
  • 屬于**“空間換時間”**的排序策略。

2. 時間復雜度與空間復雜度

維度

說明

最好情況

O(n)(數據均勻分布,每個桶元素數量均衡)

平均情況

O(n + k),k為桶數量(若每個桶內用O(n2)排序,則為O(n + n2/k))

最壞情況

O(n2)(所有數據集中在一個桶內)

空間復雜度

O(n + k)(需要額外存儲桶和桶內數據)

3. 適用場景

推薦場景

不推薦場景

- 數據均勻分布

- 數據分布極度不均

- 數據范圍已知

- 內存嚴格受限

- 外部排序(如大數據)

- 數據范圍未知或動態變化

- 需要穩定排序

- 對空間效率要求高

4. 代碼實現(Python)

以下是將范圍 [0, 100) 的整數分為10個桶的示例:

def bucket_sort(arr, bucket_size=10):if len(arr) == 0:return arr# 1. 計算數據范圍min_val, max_val = min(arr), max(arr)bucket_count = (max_val - min_val) // bucket_size + 1buckets = [[] for _ in range(bucket_count)]# 2. 分桶for num in arr:idx = (num - min_val) // bucket_sizebuckets[idx].append(num)# 3. 桶內排序(此處使用內置排序,實際可用插入排序)sorted_arr = []for bucket in buckets:sorted_arr.extend(sorted(bucket))  # 穩定排序需保持插入順序return sorted_arr# 示例調用
arr = [29, 25, 3, 49, 9, 37, 21, 43]
sorted_arr = bucket_sort(arr)
print("排序結果:", sorted_arr)  # 輸出: [3, 9, 21, 25, 29, 37, 43, 49]

5. 分桶過程示例

假設輸入數組為 [29, 25, 3, 49, 9, 37, 21, 43],最小值為3,最大值為49,桶大小為10:

  1. 計算桶數量(49 - 3) // 10 + 1 = 5個桶(范圍分別為3-12, 13-22, 23-32, 33-42, 43-52)。
  2. 分桶結果
    • Bucket 0 (3-12): [3, 9]
    • Bucket 1 (13-22): [21]
    • Bucket 2 (23-32): [29, 25]
    • Bucket 3 (33-42): [37]
    • Bucket 4 (43-52): [49, 43]
  3. 桶內排序
    • Bucket 0 → [3, 9]
    • Bucket 1 → [21]
    • Bucket 2 → [25, 29]
    • Bucket 3 → [37]
    • Bucket 4 → [43, 49]
  4. 合并結果[3, 9, 21, 25, 29, 37, 43, 49]

6. 優化策略

  • 動態調整桶大小:根據數據分布自動調整桶的數量和范圍。
  • 混合排序算法:對小桶使用插入排序,對大桶遞歸使用桶排序。
  • 處理重復元素:使用計數排序優化含大量重復值的數據。

7. 對比其他排序算法

維度

桶排序

快速排序

歸并排序

排序類型

非比較排序

比較排序

比較排序

穩定性

是(若桶內排序穩定)

最佳場景

均勻分布數據

通用隨機數據

鏈表/外部排序

空間開銷

高(需額外桶空間)

低(遞歸棧)

高(合并需額外數組)

8. 總結

桶排序在數據均勻分布且范圍已知時效率極高,但需權衡空間開銷。適用于大規模數據、外部排序及特定場景(如浮點數排序)。實際應用中需結合數據特點調整分桶策略,以平衡時間與空間效率。

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

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

相關文章

brep2seq 論文筆記

Brep2Seq: a dataset and hierarchical deep learning network for reconstruction and generation of computer-aided design models | Journal of Computational Design and Engineering | Oxford Academic 這段文本描述了一個多頭自注意力機制(MultiHead Attenti…

在 LangGraph 中集成 Mem0 記憶系統教程

簡介 LangGraph 是一個強大的對話流程編排框架,而 Mem0 則是一個高效的記憶系統。本教程將介紹如何將兩者結合,創建一個具有記憶能力的客服助手系統。 環境準備 首先安裝必要的依賴: pip install langgraph mem0 langchain openai基礎配置…

ceph 報錯 full ratio(s) out of order

full ratio(s) out of order你遇到的錯誤信息: full ratio(s) out of order說明你設置的 OSD 空間使用閾值之間的數值順序不正確,即: nearfull_ratio ≤ backfillfull_ratio ≤ full_ratio ≤ osd_failsafe_full_ratio如果它們的關系不滿足這個順序,Ceph 就會報這個錯誤。…

NB-IoT NPUSCH(三)-資源映射

資源映射單獨做一章節,是因為NPUSCH的資源映射比較復雜。與LTE不同,為了提高數據傳輸的質量,NB-IoT的數據會有重復傳輸。NPUSCH一開始生成的TBS只與子載波個數、RU個數有關,與重復次數沒有關系。初始產生的數據為 個時隙&#xff…

華為OD機試真題——荒島求生(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

centos7安裝MySQL(保姆級教學)

在 Linux 系統的軟件管理中,YUM(Yellowdog Updater, Modified)包管理器是不可或缺的工具,而 YUM 源的選擇與配置直接影響著軟件安裝與更新的效率。本文將深入解析網絡 YUM 源的分類,詳細介紹如何使用知名平臺提供的 YU…

DeepSeek 賦能教育游戲化:AI 重構學習體驗的技術密碼

目錄 一、引言:教育游戲化與 DeepSeek 的相遇二、DeepSeek 技術剖析2.1 核心架構2.2 關鍵技術 三、教育游戲化設計的奧秘3.1 概念與意義3.2 常見方法與元素3.3 成功案例借鑒 四、DeepSeek 在教育游戲化設計中的多面應用4.1 個性化學習路徑打造4.2 智能教學輔助工具4…

WPF命令與MVVM模式:打造優雅的應用程序架構

?? 打造優雅的應用程序架構 1. ?? 命令系統基礎1.1 ?? 為什么需要命令?1.2 ??? ICommand接口1.3 ??? 實現基本命令2. ??? MVVM模式詳解2.1 ?? MVVM三大組件2.2 ??? 創建ViewModel基類2.3 ?? 典型ViewModel示例3. ?? 命令綁定實戰3.1 ?? View中的命令…

真實案例拆解:智能AI客服系統中的兩類緩存協同

真實案例拆解:智能客服系統中的兩類緩存協同 在AI客服系統中,“響應速度”與“語義準確性”是一對天然的矛盾體。為了實現秒級應答與智能理解的雙重目標,系統需要在技術架構中融合精確命中的緩存系統(如Redis)與模糊語義識別的向量數據庫(如Milvus)。這兩種能力的結合,…

FastAPI與MongoDB分片集群:異步數據路由與聚合優化

title: FastAPI與MongoDB分片集群:異步數據路由與聚合優化 date: 2025/05/26 16:04:31 updated: 2025/05/26 16:04:31 author: cmdragon excerpt: FastAPI與MongoDB分片集群集成實戰探討了分片集群的核心概念、Motor驅動配置技巧、分片數據路由策略、聚合管道高級應用、分片…

一起學數據結構和算法(三)| 字符串(線性結構)

字符串(String) 字符串是由字符組成的有限序列,在計算機中通常以字符數組形式存儲,支持拼接、查找、替換等操作。 簡介 字符串是計算機科學中最常用的數據類型之一,由一系列字符組成的有限序列。在大多數編程語言中&…

2025電工杯數學建模競賽A題 光伏電站發電功率日前預測問題 保姆級教程講解|模型講解

完整內容請看文章最下面的推廣群 2025電工杯數學建模競賽 A題保姆級分析完整思路代碼數據教學 2025電工杯 A題保姆級教程思路分析 DS數模-全國大學生電工數學建模(電工杯) A題保姆級教程思路分析 A題:光伏電站發電功率日前預測問題 下面我…

React Native 拼音及拼音首字母搜索組件開發

寫在前面 “用戶說找不到聯系人?拼音搜索功能必須安排上!” —— 當產品經理第N次提出這個需求時,我意識到需要開發一個強大的拼音搜索組件。本文將詳細介紹如何開發一個支持拼音匹配、首字母搜索的React Native搜索組件,讓你的應…

springboot--實戰--大事件--用戶接口開發

開發模式&環境搭建 開發模式: 前后端分離開發 前端程序員寫前端頁面,后端程序員寫后端的接口,前端工程發送請求來訪問后臺,后臺處理完請求后要給前端相應對應的數據。 還需要一套標準來約束即接口文檔,在接口文…

html使用JS實現賬號密碼登錄的簡單案例

目錄 案例需求 思路 錯誤案例及問題 修改思路 案例提供 所需要的組件 <input>標簽&#xff0c;<button>標簽&#xff0c;<script>標簽 詳情使用參考&#xff1a;HTML 教程 | 菜鳥教程 案例需求 編寫一個程序&#xff0c;最多允許用戶嘗試登錄 3 次。…

小米玄戒O1架構深度解析(一):十核異構設計與緩存層次詳解

前言 這兩天&#xff0c;小米的全新SOC玄戒O1橫空出世&#xff0c;引發了科技數碼圈的一次小地震&#xff0c;那么小米的這顆所謂的自研SOC&#xff0c;內部究竟有著什么不為人知的秘密呢&#xff1f;我們一起一探究竟。 目錄 前言1 架構總覽1.1 基本構成1.2 SLC缺席的原因探…

VSCode如何像Pycharm一樣“““回車快速生成函數注釋文檔?如何設置文檔的樣式?autoDocstring如何設置自定義模板?

文章目錄 ?? 介紹 ???? 演示環境 ???? 讓VSCode擁有PyCharm級注釋生成能力 ???? 實現方案??? 備用方案?? 自定義注釋文檔格式樣式 ???? 切換主流注釋風格? 深度自定義模板??? 類型提示與注釋聯動優化?? 相關鏈接 ???? 介紹 ?? 用PyCharm寫P…

數據庫的事務(Transaction)

在數據庫中&#xff0c;事務&#xff08;Transaction&#xff09; 是保證數據操作一致性和完整性的核心機制。它通過一組原子性的操作單元&#xff0c;確保所有操作要么全部成功&#xff08;提交&#xff09;&#xff0c;要么全部失敗&#xff08;回滾&#xff09;。以下是數據…

2025-05-27 Python深度學習7——損失函數和反向傳播

文章目錄 1 損失函數1.1 L1Loss1.2 MSELoss1.3 CrossEntropyLoss 2 反向傳播 本文環境&#xff1a; Pycharm 2025.1Python 3.12.9Pytorch 2.6.0cu124 1 損失函數 ? 損失函數 (loss function) 是將隨機事件或其有關隨機變量的取值映射為非負實數以表示該隨機事件的"風險&…

python+tkinter實現GUI界面調用即夢AI文生圖片API接口

背景 目前字節跳動公司提供了即夢AI的接口免費試用&#xff0c;但是并發量只有1&#xff0c;不過足夠我們使用了。我這里想做個使用pythontkinter實現的GUI可視化界面客戶端&#xff0c;這樣就不用每次都登錄官方網站去進行文生圖片&#xff0c;當然文生視頻&#xff0c;或者圖…