【java實現+4種變體完整例子】排序算法中【桶排序】的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格

以下是桶排序的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格:
在這里插入圖片描述


一、桶排序基礎實現

原理

將數據分到有限數量的桶中,每個桶內部使用其他排序算法(如插入排序或快速排序),最后合并所有桶的結果。

代碼示例
import java.util.ArrayList;
import java.util.List;public class BucketSort {void sort(float[] arr) {if (arr.length == 0) return;// 創建桶(假設每個桶是一個ArrayList)int bucketCount = arr.length; // 桶的數量通常與元素數量相近List<ArrayList<Float>> buckets = new ArrayList<>();for (int i = 0; i < bucketCount; i++) {buckets.add(new ArrayList<>());}// 將數據分配到桶中for (float num : arr) {int index = (int) Math.floor(num * bucketCount);buckets.get(index).add(num);}// 對每個桶進行排序(此處使用插入排序)for (ArrayList<Float> bucket : buckets) {insertionSort(bucket);}// 合并所有桶的結果到原數組int index = 0;for (ArrayList<Float> bucket : buckets) {for (float num : bucket) {arr[index++] = num;}}}// 插入排序用于桶內排序private void insertionSort(ArrayList<Float> list) {for (int i = 1; i < list.size(); i++) {float key = list.get(i);int j = i - 1;while (j >= 0 && list.get(j) > key) {list.set(j + 1, list.get(j));j--;}list.set(j + 1, key);}}
}
復雜度分析
  • 時間復雜度
    • 平均:O(n + k)k為桶的數量)。
    • 最壞:O(n2)(數據分布極不均勻時,桶內排序退化)。
  • 空間復雜度O(n + k)
  • 穩定性:穩定(若桶內排序算法穩定)。

二、常見變體及代碼示例

1. 自適應桶排序(動態桶大小)

改進點:根據數據分布動態調整桶的大小,減少極端分布的影響。
適用場景:數據分布不均勻時。

import java.util.ArrayList;
import java.util.List;public class AdaptiveBucketSort {void sort(float[] arr) {if (arr.length == 0) return;// 統計數據分布float min = Arrays.stream(arr).min().getAsFloat();float max = Arrays.stream(arr).max().getAsFloat();int bucketCount = arr.length;float bucketSize = (max - min) / bucketCount;List<ArrayList<Float>> buckets = new ArrayList<>();for (int i = 0; i < bucketCount; i++) {buckets.add(new ArrayList<>());}// 動態分配到桶for (float num : arr) {int index = (int) ((num - min) / bucketSize);index = Math.min(index, bucketCount - 1); // 防止溢出buckets.get(index).add(num);}// 桶內排序并合并int index = 0;for (ArrayList<Float> bucket : buckets) {insertionSort(bucket);for (float num : bucket) {arr[index++] = num;}}}private void insertionSort(ArrayList<Float> list) {// 同基礎版本的插入排序}
}
2. 分布式桶排序

改進點:利用多線程對多個桶并行排序。
適用場景:大數據或分布式計算環境。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class ParallelBucketSort {void sort(float[] arr) {if (arr.length == 0) return;int bucketCount = arr.length;List<ArrayList<Float>> buckets = new ArrayList<>();for (int i = 0; i < bucketCount; i++) {buckets.add(new ArrayList<>());}// 分配到桶for (float num : arr) {int index = (int) Math.floor(num * bucketCount);buckets.get(index).add(num);}// 并行排序每個桶ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());for (ArrayList<Float> bucket : buckets) {executor.submit(() -> insertionSort(bucket));}executor.shutdown();try {executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);} catch (InterruptedException e) {e.printStackTrace();}// 合并結果int index = 0;for (ArrayList<Float> bucket : buckets) {for (float num : bucket) {arr[index++] = num;}}}private void insertionSort(ArrayList<Float> list) {// 同基礎版本的插入排序}
}
3. 基于鏈表的桶排序

改進點:用鏈表存儲桶中的元素,避免動態擴容開銷。
適用場景:頻繁插入/刪除元素的場景。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class LinkedListBucketSort {void sort(float[] arr) {if (arr.length == 0) return;int bucketCount = arr.length;List<LinkedList<Float>> buckets = new ArrayList<>();for (int i = 0; i < bucketCount; i++) {buckets.add(new LinkedList<>());}// 分配到桶for (float num : arr) {int index = (int) Math.floor(num * bucketCount);buckets.get(index).add(num);}// 對每個桶排序(此處用快速排序)for (LinkedList<Float> bucket : buckets) {quickSort(bucket, 0, bucket.size() - 1);}// 合并結果int index = 0;for (LinkedList<Float> bucket : buckets) {for (float num : bucket) {arr[index++] = num;}}}private void quickSort(LinkedList<Float> list, int low, int high) {// 快速排序實現(略)}
}

三、變體對比表格

變體名稱時間復雜度空間復雜度穩定性主要特點適用場景
基礎桶排序O(n + k)(平均)
O(n2)(最壞)
O(n + k)穩定簡單實現,適用于均勻分布數據值域均勻且數據量適中的場景
自適應桶排序O(n + k)O(n + k)穩定動態調整桶大小,適應不均勻分布數據分布不均勻但需穩定性
分布式桶排序O(n/k + k)(并行)O(n + k)穩定并行加速,適合大數據或分布式系統大數據集或高性能計算環境
基于鏈表的桶排序O(n + k)O(n + k)不穩定鏈表存儲減少擴容開銷,桶內排序可選算法需頻繁插入/刪除或對內存敏感場景

四、關鍵選擇原則

  1. 基礎場景:優先使用基礎桶排序,因其簡單且適合均勻分布數據。
  2. 數據分布不均勻:自適應桶排序通過動態調整桶大小,減少極端情況的影響。
  3. 性能優化:分布式版本利用多線程加速,適合大數據或并行環境。
  4. 內存效率:鏈表桶排序減少動態擴容開銷,但需注意桶內排序算法的穩定性。
  5. 穩定性需求:若需穩定排序,避免使用鏈表桶排序(若桶內使用快速排序等不穩定算法)。

通過選擇合適的變體,可在特定場景下優化性能或適應數據特性。例如,自適應桶排序解決數據分布問題,而分布式版本提升處理超大數據的效率。

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

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

相關文章

Linux[基本指令]

Linux[基本指令] pwd 查看當前所處的工作目錄 斜杠在Linux中作為路徑分割符 路徑存在的價值為了確定文件的唯一性 cd指令 更改路徑 cd 你要去的路徑(直接進入) cd . 當前目錄 cd . . 上級目錄(路徑回退) 最后的’/為根目錄(根節點) Linux還是window的目錄結構都是樹狀…

git -- 對遠程倉庫的操作 -- 查看,添加(與clone對比),抓取和拉取,推送(注意點,抓取更新+合并的三種方法,解決沖突,對比),移除

目錄 對遠程倉庫的操作 介紹 查看 (git remote) 介紹 查看詳細信息 添加(git remote add) 介紹 與 git clone對比 從遠程倉庫中抓取與拉取 抓取(git fetch) 拉取(git pull) 推送(git push) 介紹 注意 抓取更新合并的方法 git fetch git merge 解決沖突 git …

vue3 excel文件導入

文章目錄 前言使用在vue文件中的使用 前言 最近寫小組官網涉及到了excel文件導入的功能 場景是導入小組成員年級 班級 郵箱 組別 姓名等基本信息的excel表格用于展示各組信息 使用 先下載js庫 npm install xlsx為了提高代碼的復用性 我將它寫成了一個通用的函數 import ap…

Docker環境下SpringBoot程序內存溢出(OOM)問題深度解析與實戰調優

文章目錄 一、問題背景與現象還原**1. 業務背景****2. 故障特征****3. 核心痛點****4. 解決目標** 二、核心矛盾點分析**1. JVM 與容器內存協同失效****2. 非堆內存泄漏****3. 容器內存分配策略缺陷** 三、系統性解決方案**1. Docker 容器配置**2. JVM參數優化&#xff08;容器…

【PGCCC】Postgres MVCC 內部:更新與插入的隱性成本

為什么 Postgres 中的更新操作有時感覺比插入操作慢&#xff1f;答案在于 Postgres 如何在后臺管理數據版本。 Postgres 高效處理并發事務能力的核心是多版本并發控制&#xff08;MVCC&#xff09;。 在本文中&#xff0c;我將探討 MVCC 在 Postgres 中的工作原理以及它如何影響…

Docker使用、容器遷移

Docker 簡介 Docker 是一個開源的容器化平臺&#xff0c;用于打包、部署和運行應用程序及其依賴環境。Docker 容器是輕量級的虛擬化單元&#xff0c;運行在宿主機操作系統上&#xff0c;通過隔離機制&#xff08;如命名空間和控制組&#xff09;確保應用運行環境的一致性和可移…

c#清理釋放內存

雖然c#具有內存管理和垃圾回收機制&#xff0c;但是在arcobjects二次開發嵌入到arcgis data reviewet還會報內存錯誤。需要強制清理某變量內存方法如下: 1設置靜態函數ReleaseCom函數 public static void ReleaseCom(object o) { try{System.Runtime.InteropServices.Marsh…

Linux:進程:進程控制

進程創建 在Linux中我們使用fork函數創建新進程&#xff1a; fork函數 fork函數是Linux中的一個系統調用&#xff0c;用于創建一個新的進程&#xff0c;創建的新進程是原來進程的子進程 返回值&#xff1a;如果子進程創建失敗&#xff0c;返回值是-1。如果子進程創建成功&a…

day1-小白學習JAVA---JDK安裝和環境變量配置(mac版)

JDK安裝和環境變量配置 我的電腦系統一、下載JDK1、oracle官網下載適合的JDK安裝包&#xff0c;選擇Mac OS對應的版本。 二、安裝三、配置環境變量1、終端輸入/usr/libexec/java_home -V查詢所在的路徑&#xff0c;復制備用2、輸入ls -a3、檢查文件目錄中是否有.bash_profile文…

Python項目--基于機器學習的股票預測分析系統

1. 項目介紹 在當今數字化時代&#xff0c;金融市場的數據分析和預測已經成為投資決策的重要依據。本文將詳細介紹一個基于Python的股票預測分析系統&#xff0c;該系統利用機器學習算法對歷史股票數據進行分析&#xff0c;并預測未來股票價格走勢&#xff0c;為投資者提供決策…

計算機視覺與深度學習 | 基于YOLOv8與光流法的目標檢測與跟蹤(Python代碼)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 目標檢測與跟蹤 關鍵實現邏輯檢測-跟蹤協作機制?特征點選擇策略?運動…

Java集合及面試題學習

知識來源沉默王二、小林coding、javaguide 1、ArrayList list.add("66") list.get(2) list.remove(1) list.set(1,"55") List<String> listnew ArrayList<>(); 底層是動態數組 添加元素流程&#xff1a;判斷是否擴容&#xf…

OSPF --- LSA

文章目錄 一、OSPF LSA&#xff08;鏈路狀態通告&#xff09;詳解1. LSA通用頭部2. OSPFv2 主要LSA類型a. Type 1 - Router LSAb. Type 2 - Network LSAc. Type 3 - Summary LSAd. Type 4 - ASBR Summary LSAe. Type 5 - AS External LSAf. Type 7 - NSSA External LSA 3. LSA泛…

Spring Boot 框架介紹及 Spring Boot 與 Spring 實現對比

在日常 Java Web 開發中&#xff0c;Spring 框架幾乎是繞不開的技術體系。傳統的 Spring 項目因其靈活強大而被廣泛應用&#xff0c;但隨著項目規模擴大與業務復雜度提升&#xff0c;XML 配置繁瑣、部署復雜等問題逐漸顯現。為此&#xff0c;Spring Boot 應運而生。 Spring Boo…

基于CNN卷積神經網絡和GEI步態能量提取的視頻人物步態識別算法matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 GEI步態能量提取 4.2 CNN卷積神經網絡原理 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 2.算法運行軟件版本 matlab2024b/matlab2022a 3.部分核心程序 &…

創建型模式:建造者模式

什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一種創建型設計模式&#xff0c;它將一個復雜對象的構建過程與其表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。簡單來說&#xff0c;建造者模式允許您一步一步創建復雜對象&#xff0c;而…

Linux `init 5` 相關命令的完整使用指南

Linux init 5 相關命令的完整使用指南—目錄 一、init 系統簡介二、init 5 的含義與作用三、不同 Init 系統下的 init 5 行為1. SysVinit&#xff08;如 CentOS 6、Debian 7&#xff09;2. systemd&#xff08;如 CentOS 7、Ubuntu 16.04&#xff09;3. Upstart&#xff08;如 …

RabbitMQ常見面試題回答重點

文章目錄 什么是消息隊列&#xff1f;為什么需要消息隊列消息隊列的模型消息隊列常見名詞如何保證消息不丟失&#xff1f;&#xff08;可靠性&#xff09;如何保證消息不重復/業務冪等性如何保證消息有序性如何處理消息堆積消息隊列設計為推送還是拉取 / 推拉模式優點無法路由的…

欣佰特攜數十款機器人相關前沿產品,亮相第二屆人形機器人和具身智能行業盛會

2025年4月15日至16日&#xff0c;備受關注的第二屆中國人形機器人與具身智能產業大會已在北京成功舉行。作為國內前沿科技及產品服務領域的重要參與者&#xff0c;欣佰特科技攜眾多前沿產品精彩亮相&#xff0c;全方位展示了其在人形機器人與具身智能領域的創新產品。 在本次大…

Docker安裝 (centos)

1.安裝依賴包&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2.刪除已有的 Docker 倉庫文件&#xff08;如果有&#xff09;&#xff1a; sudo rm -f /etc/yum.repos.d/docker-ce.repo 3.添加阿里云的 Docker 倉庫&#xff1a; sudo yum…