桶排序-Java實現

桶排序是一種分配式排序算法,將元素分到有限數量的桶里,每個桶再單獨排序(比如用插入排序),最后依次把各個桶中的元素取出來即完成排序。

時間復雜度:最佳 O(n) | 平均 O(n + n2/k + k) | 最差 O(n2)

空間復雜度:O(n + k)

穩定性:穩定

應用場景/前提條件

  • 適合均勻分布的數據
  • 需要額外空間
  • 可以與其他排序算法結合

介紹

桶排序(Bucket Sort)是一種分布式排序算法,核心思想是將數據分散到有限數量的桶中,然后對每個桶中的數據進行排序,最后將各個桶中的數據有序地合并起來。桶排序是計數排序的擴展版本,特別適合均勻分布的數據集。

桶排序的效率取決于數據分布的均勻性。在最佳情況下,桶排序的時間復雜度可以達到 O(n),在特定場景下非常高效。桶排序結合了哈希表的思想,通過映射函數將元素分配到不同的桶中實現排序????????

算法步驟

  1. 確定桶的數量和范圍,創建對應數量的桶(通常是數組或鏈表)
  2. 根據映射函數將每個元素分配到對應的桶中
  3. 對每個桶內的元素分別進行排序(可以使用任何排序算法)
  4. 按照桶的順序將各個桶中的元素依次取出,組成有序序列

代碼實現如下(浮點類型):
?

public static void main(String[] args) {float[] nums = {0.23f,1f,0.82f,0f,1.2f,999f};handleData(nums);for (Float num : nums){System.out.println( num+" ");}}public static void handleData(float[] nums){//獲取最大最小數float max = nums[0];float min = nums[0];for(float num : nums){if(num> max){max = num;}if(num<min){min = num;}}//初始化桶List<List<Float>> list = new ArrayList<>();for(int i = 0; i< nums.length;i++){list.add(new ArrayList<>());}//桶范圍設置int step = (int)Math.ceil((double)(max-min)/(nums.length));//將元素放入桶中for(float num : nums){int index = (int)(num - min) / step;//處理臨界桶if(index == nums.length){index--;}list.get(index).add(num);}//桶中元素排序for(List<Float> key: list){for(int i = 1; i< key.size(); i++){float key1 = key.get(i);int j = i-1;while(j>=0&&key.get(j)>key1){key.set(j+1, key.get(j));j--;}key.set(j+1, key1);}}//將元素重新放回數值中int i = 0;for(List<Float> key: list){for(Float index: key){nums[i++] = index;}}}

代碼實現如下(整數類型):

public static void main(String[] args) {int[] nums = {2,6,6,8,9,7,3,4,44,15,22};handleData1(nums);for (int num : nums){System.out.println( num+" ");}}public static void handleData1(int[] nums){//獲取最大最小數int max = nums[0];int min = nums[0];for(int num : nums){if(num> max){max = num;}if(num<min){min = num;}}//初始化桶List<List<Integer>> list = new ArrayList<>();for(int i = 0; i< nums.length;i++){list.add(new ArrayList<>());}//桶范圍計算-最大值-最小值/數組長度,再向上取整int step = (int)Math.ceil((double)(max-min)/(nums.length));//將元素放入桶中for(int num : nums){int index = (num - min) / step;if(index == nums.length){index--;}list.get(index).add(num);}//桶中元素排序--插入算法for(List<Integer> key: list){for(int i = 1; i< key.size(); i++){int index=  key.get(i);int j = i-1;while(j>=0 && key.get(j)>index){key.set(j+1,key.get(j));j--;}key.set(j+1,index);}}//將元素重新放回數值中int i = 0;for(List<Integer> key: list){for(Integer index: key){nums[i++] = index;}}}

以上代碼實現是根據個人理解情況,按思路寫的實現流程,還要許多可優化的地方,如桶個數、桶的數據范圍,都是可以優化的顛;
注意實際的算法中,還需要注意特殊情況的處理,如算法題:
164. 最大間距 - 力扣(LeetCode)
個人算法題解如下:
?

if(nums.length <2){return 0;}int k = handleData(nums);if (k ==0){return 0;}//最大差值int num = 0;for(int i =0; i<nums.length-1; i++){if ((nums[i+1]-nums[i])>num){num = nums[i+1]-nums[i];}}return num;}public int handleData(int[] nums){//獲取最大最小數int max = nums[0];int min = nums[0];for(int num : nums){if(num> max){max = num;}if(num<min){min = num;}}if(max-min == 0){return 0;}//初始化桶List<List<Integer>> list = new ArrayList<>();for(int i = 0; i< nums.length;i++){list.add(new ArrayList<>());}//桶范圍設置int step = (int)Math.ceil((double)(max-min)/(nums.length));//將元素放入桶中for(int num : nums){//int index = (int)((num-min)/step*(backetCount-1));int index = (num - min) / step;if(index == nums.length){index--;}list.get(index).add(num);}//桶中元素排序for(List<Integer> key: list){for(int i = 1; i< key.size(); i++){if(key.get(i-1)>key.get(i)){Integer temp = key.get(i);key.set(i,key.get(i-1));key.set(i-1,temp);}}}//將元素重新放回數值中int i = 0;for(List<Integer> key: list){for(Integer index: key){nums[i++] = index;}}return 1;}

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

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

相關文章

oracle知識

這里寫自定義目錄標題Oracle常用的數據類型&#xff1a;Oracle實操&#xff1a;創建數據表Oracle約束建表的時候設置約束&#xff1a;表創建后添加添加約束&#xff1a;Oracle常用的數據類型&#xff1a; Oracle實操&#xff1a;創建數據表 Oracle約束 建表的時候設置約束&…

超級人工智能+無人機操控系統,振興鄉村經濟的加速器,(申請專利應用),嚴禁抄襲!

無人機邊緣智能系統&#xff1a;山林珍稀資源探測的完整架構與實戰指南本人設計的多模態邊緣AI系統已在秦嶺山區完成實地驗證&#xff0c;對7種高價值食用菌識別準確率達94.3%&#xff0c;定位誤差小于0.8米一、前沿技術融合的商業化機遇根據Gartner 2025年技術成熟度曲線分析&…

用騰訊地圖寫一個逆地址解析(很詳細)

首先說明以下代碼適合有前端基礎知識的同學。以下是css和html部分<!DOCTYPE html><html lang"zh-CN"><!-- lang是用來申明語言類型&#xff0c;這里申明為中文&#xff08;zh&#xff09;中國大陸&#xff08;CN&#xff09;補充中文繁體為zh-TW --&g…

在 Vue3+Vite+TypeScript 項目中使用 svg 文件并支持自定義樣式

參考文檔&#xff1a;vite-svg-loader 安裝與配置 安裝插件 pnpm add vite-svg-loader -D配置 // vite.config.ts import svgLoader from vite-svg-loaderexport default defineConfig({plugins: [vue(),svgLoader({defaultImport: component})] })使用 <script setup …

ShimetaPi M4-R1:國產高性能嵌入式平臺的異構計算架構與OpenHarmony生態實踐

在全球化芯片供應鏈波動及樹莓派等硬件持續漲價的背景下&#xff0c;ShimetaPi M4-R1 作為全棧國產化嵌入式開發平臺&#xff0c;以 高性能異構計算架構 和 開源鴻蒙原生支持 為核心突破點&#xff0c;填補了中高端邊緣設備開發的國產方案空白。其基于瑞芯微 RK3568B2 的硬件設…

zookeeper分布式鎖 -- 讀鎖和寫鎖實現方式

讀鎖和寫鎖讀鎖: 是共享鎖,讀鎖與讀鎖是可以兼容的,所以同時有多個請求都可以持有寫鎖: 是獨占鎖,寫鎖與任何鎖都互斥,所以只有一個請求持有,這個請求釋放寫鎖其他請求才能持有一旦持有寫鎖,說明數據在發送變化就不能讀了,自然一個請求就不能出現讀鎖和寫鎖共存的情況總結: 讀鎖…

第二篇:Linux 文件系統操作:從基礎到進階

目錄 一、文件與目錄管理基礎 創建文件 創建目錄 目錄結構查看 二、鏈接文件深入理解 創建軟鏈接 創建硬鏈接 核心區別對比 三、文件壓縮與解壓縮全攻略 1、壓縮命令對比 2、解壓縮命令 3、三種壓縮方式性能對比 4、通用解壓技巧 四、文件查找與搜索 1、按文件名…

嗶哩嗶哩招游戲內容產品運營

游戲內容產品運營【2026屆】&#xff08;崗位信息已獲jobleap.cn授權轉發到csdn&#xff09;嗶哩嗶哩集團 上海收錄時間&#xff1a; 2025年08月01日職位描述1、負責研究B站游戲創作者的創作過程、動機及遇到的問題&#xff0c;產出研究報告&#xff1b; 2、結合用研分析和相關…

談談Flutter中的Key

目錄 前言 一、什么是Key 1.StatelessWidget 2.StatefulWidget 3.加入Key后的效果 二、什么時候應該使用 Key&#xff1f; 1.Flutter判斷widget的邏輯 1.Flutter判斷組件身份的規則 1.Widget的類型&#xff08;runtimeType&#xff09;相同 2. Key相同&#xff08;ke…

重生之我在暑假學習微服務第八天《OpenFeign篇》

個人主頁&#xff1a;VON文章所屬專欄&#xff1a;微服務 微服務系列文章 重生之我在暑假學習微服務第一天《MybatisPlus-上篇》重生之我在暑假學習微服務第二天《MybatisPlus-下篇》重生之我在暑假學習微服務第三天《Docker-上篇》重生之我在暑假學習微服務第四天《Docker-下篇…

風光儲綜合能源系統雙層優化規劃設計【MATLAB模型實現】

本模型基于雙層優化框架&#xff0c;利用KKT條件、大M法、對偶理論求解&#xff0c;專注于綜合能源系統&#xff08;微電網&#xff09;多電源容量優化配置的模型介紹。代碼采用CPLEX求解器&#xff0c;注釋詳盡&#xff0c;非常適合新手學習該類問題的建模與求解思路。 模型總…

雪花算法重復id問題

原理解析 雪花算法實現簡單、適配性強&#xff0c;無論是電商訂單、日志追蹤還是分布式存儲&#xff0c;都能滿足 “唯一、有序、高效、可擴展” 的核心需求&#xff0c;因此成為分布式ID主流選擇。雪花算法生成的ID是一個64位的整數&#xff0c;由多段不同意義的數字拼接而成&…

MQTT 入門教程:三步從 Docker 部署到 Java 客戶端實現

在物聯網&#xff08;IoT&#xff09;與邊緣計算快速發展的今天&#xff0c;設備間的高效通信成為核心需求。MQTT 作為一種輕量級的發布 / 訂閱模式協議&#xff0c;憑借其低帶寬占用、強穩定性和靈活的消息路由能力&#xff0c;已成為物聯網通信的事實標準。無論是智能家居的設…

公網服務器上Nginx或者Openresty如何屏蔽IP直接掃描

0x01 背景云服務器很多時候為了通信需要設置公網訪問&#xff0c;但是網絡當中存在很多的掃描器&#xff0c;無時無刻在掃描&#xff0c;當80,443端口暴露時&#xff0c;成了這些掃描IP的攻擊對象&#xff0c;無時無刻收到威脅。0x02 掃描攻擊方式1.直接通過公網IP地址進行一些…

C語言(長期更新)第8講 函數遞歸

C語言&#xff08;長期更新&#xff09; 第8講:函數遞歸 跟著潼心走&#xff0c;輕松拿捏C語言&#xff0c;困惑通通走&#xff0c;一去不回頭~歡迎開始今天的學習內容&#xff0c;你的支持就是博主最大的動力。 目錄 C語言&#xff08;長期更新&#xff09; 第8講 函數遞歸…

[硬件電路-129]:模擬電路 - 繼電器的工作原理、關鍵指標、常用芯片與管腳定義

一、工作原理繼電器是一種基于電磁感應原理的自動開關裝置&#xff0c;通過控制小電流電路實現大電流電路的通斷。其核心結構包括&#xff1a;電磁鐵&#xff08;線圈鐵芯&#xff09;&#xff1a;通電時產生磁場&#xff0c;吸引銜鐵動作。觸點系統&#xff1a;包含常開觸點&a…

Haproxy調度算法 - 靜態算法介紹與使用

文章目錄一、概述二、socat工具三、static-rr四、firstHAProxy通過固定參數 balance 指明對后端服務器的調度算法&#xff0c;該參數可以配置在listen或backend選項中。HAProxy的調度算法分為靜態和動態調度算法&#xff0c;但是有些算法可以根據參數在靜態和動態算法中相互轉換…

模擬激光相機工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

模擬激光相機工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

AWS Blockchain Templates:快速部署企業級區塊鏈網絡的終極解決方案

無需精通底層架構&#xff0c;一鍵搭建Hyperledger Fabric或以太坊網絡&#xff01;AWS Blockchain Templates 可幫助您快速基于不同的區塊鏈框架在 AWS 上創建和部署區塊鏈網絡。區塊鏈是一種分布式數據庫技術&#xff0c;用于維護不斷增長的交易記錄和智能合約集合&#xff0…

Vue 服務端渲染 Nuxt 使用詳解

Nuxt 是基于 Vue 的高層框架&#xff0c;專注于服務器端渲染應用開發。它封裝了繁瑣的配置和通用模式&#xff0c;提供了開箱即用的 SSR 功能&#xff0c;使開發者能夠專注于編寫業務邏輯。 1. Nuxt 的核心特性 SSR 支持&#xff1a;默認支持服務端渲染&#xff0c;提高應用性…