Java實現桶排序算法

?

?

1. 桶排序原理圖解

?

桶排序是一種基于分桶思想的非比較排序算法,適用于數據分布較為均勻的場景。其核心思想是將數據分散到有限數量的“桶”中,每個桶再分別進行排序(通常使用插入排序或其他簡單的排序算法)。以下是桶排序的步驟:

?

1. 確定桶的數量和范圍:

? ?- 根據數據的范圍和分布,確定桶的數量和每個桶的范圍。

?

2. 分配數據到桶中:

? ?- 遍歷數組,將每個元素分配到對應的桶中。

?

3. 對每個桶內的數據排序:

? ?- 對每個桶內的數據進行排序(通常使用插入排序)。

?

4. 合并桶中的數據:

? ?- 按順序將所有桶中的數據合并到一個數組中。

?

圖解示例:

?

假設數組為 `[0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68]`,桶的數量為 10。

?

1. 初始狀態:`[0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68]`

2. 分配到桶中:

? ?- 桶0: `[0.12, 0.17]`

? ?- 桶1: `[0.21, 0.23, 0.26]`

? ?- 桶3: `[0.39]`

? ?- 桶6: `[0.68]`

? ?- 桶7: `[0.72, 0.78]`

? ?- 桶9: `[0.94]`

3. 對每個桶內的數據排序:

? ?- 桶0: `[0.12, 0.17]`

? ?- 桶1: `[0.21, 0.23, 0.26]`

? ?- 桶3: `[0.39]`

? ?- 桶6: `[0.68]`

? ?- 桶7: `[0.72, 0.78]`

? ?- 桶9: `[0.94]`

4. 合并桶中的數據:

? ?- 合并后的數組:`[0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.68, 0.72, 0.78, 0.94]`

?2. Java代碼實現及注釋

?

```java

import java.util.ArrayList;

import java.util.List;

?

public class BucketSort {

? ? public static void main(String[] args) {

? ? ? ? double[] array = {0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68};

? ? ? ? bucketSort(array);

? ? ? ? System.out.println("排序后的數組:");

? ? ? ? System.out.println(Arrays.toString(array));

? ? }

?

? ? // 桶排序主方法

? ? public static void bucketSort(double[] arr) {

? ? ? ? int n = arr.length;

? ? ? ? if (n <= 1) {

? ? ? ? ? ? return;

? ? ? ? }

?

? ? ? ? // 創建 n 個桶

? ? ? ? List<List<Double>> buckets = new ArrayList<>();

? ? ? ? for (int i = 0; i < n; i++) {

? ? ? ? ? ? buckets.add(new ArrayList<>());

? ? ? ? }

?

? ? ? ? // 將數組中的元素分配到桶中

? ? ? ? for (double value : arr) {

? ? ? ? ? ? int bucketIndex = (int) (value * n); // 假設輸入數據在 [0, 1) 范圍內

? ? ? ? ? ? buckets.get(bucketIndex).add(value);

? ? ? ? }

?

? ? ? ? // 對每個桶內的數據進行排序(這里使用插入排序)

? ? ? ? int index = 0;

? ? ? ? for (List<Double> bucket : buckets) {

? ? ? ? ? ? insertionSort(bucket);

? ? ? ? ? ? for (double value : bucket) {

? ? ? ? ? ? ? ? arr[index++] = value;

? ? ? ? ? ? }

? ? ? ? }

? ? }

?

? ? // 插入排序方法

? ? private static void insertionSort(List<Double> list) {

? ? ? ? for (int i = 1; i < list.size(); i++) {

? ? ? ? ? ? double 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);

? ? ? ? }

? ? }

}

```

?

3. 代碼說明

?

1. 桶的創建:

? ?- 根據數組長度創建 `n` 個桶,每個桶是一個 `List<Double>`。

?

2.分配數據到桶中:

? ?- 根據元素的值將其分配到對應的桶中。假設輸入數據在 `[0, 1)` 范圍內,可以通過 `value * n` 計算桶的索引。

?

3. 對每個桶內的數據排序:

? ?- 使用插入排序對每個桶內的數據進行排序。

?

4. 合并桶中的數據:

? ?- 按順序將所有桶中的數據合并到原數組中。

?

5. 時間復雜度:

? ?- **平均情況**:`O(n + k)`,其中 `n` 是數組長度,`k` 是桶的數量。

? ?- **最壞情況**:`O(n2)`(當所有數據都分配到同一個桶中時)。

?

6. 空間復雜度:

? ?- `O(n + k)`,因為需要額外的空間來存儲桶。

?

7. 穩定性:

? ?- 桶排序是**穩定的**,因為每個桶內的排序算法(如插入排序)是穩定的。

?

?4. 應用場景

?

1. 數據分布均勻:

? ?- 桶排序適用于數據分布較為均勻的場景,例如浮點數排序。

?

2. 大規模數據排序:

? ?- 當數據量較大且分布均勻時,桶排序可以高效地完成排序任務。

?

3. 教學和演示:

? ?- 桶排序的實現清晰,適合用于教學和算法演示。

?

5. 總結

?

桶排序是一種高效的非比較排序算法,特別適用于數據分布較為均勻的場景。它的優點是時間復雜度低且穩定性好,但需要額外的空間來存儲桶。在實際應用中,桶排序常用于處理大規模數據集,尤其是在數據分布均勻的情況下。

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

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

相關文章

OpenCv實戰筆記(3)基于opencv實現調用攝像頭并實時顯示畫面

一、實現效果 二、實現原理 使用 OpenCV 打開攝像頭&#xff0c;持續捕獲視頻幀&#xff0c;并在一個窗口中實時顯示這些幀&#xff0c;直到用戶按下 ESC 鍵退出。整體流程&#xff1a;打開攝像頭&#xff08;cv::VideoCapture&#xff09;>創建圖像顯示窗口&#xff08;cv…

編譯原理頭歌實驗:詞法分析程序設計與實現(C語言版)

編譯原理頭歌實驗&#xff1a;詞法分析程序設計與實現&#xff08;C語言版&#xff09; 1.實驗描述 任務描述 本關任務&#xff1a;加深對詞法分析器的工作過程的理解&#xff1b;加強對詞法分析方法的掌握&#xff1b;能夠采用一種編程語言實現簡單的詞法分析程序&#xff…

SQL常用操作大全:復制表、跨庫查詢、刪除重復數據

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01; SQL常用操作精華總結 表結構與數據操作 復制表結構&#xff1a; SELECT * INTO b FROM a WHERE 1<>1 (SQL Server專用) SELECT TOP 0 * INTO b FROM a (更通用) 拷貝表數據&#…

課外活動:簡單了解原生測試框架Unittest前置后置的邏輯

簡單了解原生測試框架Unittest前置后置的邏輯 一、測試框架執行順序解析 1.1 基礎執行流程 import unittestclass A(unittest.TestCase):classmethoddef setUpClass(cls):print(f"【CLASS START】{cls.__name__}")def setUp(self):print(f"【TEST START】{se…

學習設計模式《八》——原型模式

一、基礎概念 原型模式的本質是【克隆生成對象】&#xff1b; 原型模式的定義&#xff1a;用原型實例指定創建對象的種類&#xff0c;并通過拷貝這些原型創建新的對象 。 原型模式的功能&#xff1a; 1、通過克隆來創建新的對象實例&#xff1b; 2、為克隆出來的新對象實例復制…

olmOCR - PDF文檔處理工具包

文章目錄 一、關于 olmOCR相關資源包含內容團隊 二、安裝三、本地使用示例查看結果多節點/集群使用管道完整文檔 一、關于 olmOCR olmOCR 是用于訓練語言模型處理PDF文檔的工具包&#xff0c;支持大規模PDF文本解析和轉換。 相關資源 源碼&#xff1a;https://github.com/all…

Android開發補充內容

Android開發補充內容 fragment通信生命周期 Okhttp基本使用websocket Retrofit基本使用 RxJava基本使用定時任務 Hilt基本使用進階使用例子 組件庫Material ComponentsJetpack Compose fragment 通信 fragment于activity通信的一種原生方法是使用Bundle&#xff1a; Bundle …

隱私計算框架FATE二次開發心得整理(工業場景實踐)

文章目錄 版本介紹隱私計算介紹前言FATE架構總體架構FateBoard架構前端架構后端架構 FateClient架構創建DAG方式DAG生成任務管理python SDK方式 FateFlow架構Eggroll架構FATE算法架構Cpn層FATE ML層 組件新增流程新增組件流程新增算法流程 版本介紹 WeBank的FATE開源版本 2.2.…

AI驅動的制造工藝:系統化探索與創新

DeepSeek 技術全景 在當今 AI 技術蓬勃發展的時代,DeepSeek 已成為該領域中一顆耀眼的明星。自 2023 年 7 月 17 日成立以來,這家由知名私募巨頭幻方量化孕育而生的公司,迅速在 AI 領域嶄露頭角 。DeepSeek 的目標是開發頂尖的大語言模型(LLM),并利用數據蒸餾技術打造更精…

【嵌入式開發-LCD】

嵌入式開發-LCD ■ LCD簡介 ■ LCD簡介

java反射(2)

package 反射;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays;public class demo {public static void main(String[] args) throws Exception {// 通過類的全限定名獲取對應的 Class 對象…

使用 Cesium 構建 3D 地圖應用的實踐

CesiumJS 是一個功能強大的開源 JavaScript 庫&#xff0c;能夠幫助開發者快速構建高性能、高精度的 3D 地球和地圖應用 。本文將介紹如何使用 Cesium 構建一個基本的 3D 地圖應用&#xff0c;并加載自定義的 3D Tiles 模型。 初始化 Cesium Viewer 首先&#xff0c;在 Vue 的…

結合Splash與Scrapy:高效爬取動態JavaScript網站

在當今的Web開發中&#xff0c;JavaScript的廣泛應用使得許多網站的內容無法通過傳統的請求-響應模式直接獲取。為了解決這個問題&#xff0c;Scrapy開發者經常需要集成像Splash這樣的JavaScript渲染引擎。本文將詳細介紹Splash JS引擎的工作原理&#xff0c;并探討如何將其與S…

企業級可觀測性實現:OpenObserve云原生平臺的本地化部署與遠程訪問解析

文章目錄 前言1. 安裝Docker2. 創建并啟動OpenObserve容器3. 本地訪問測試4. 公網訪問本地部署的OpenObserve4.1 內網穿透工具安裝4.2 創建公網地址 5. 配置固定公網地址 前言 嘿&#xff0c;各位小伙伴們&#xff0c;今天要給大家揭秘一個在云原生領域里橫掃千軍的秘密法寶—…

將本地項目提交到新建的git倉庫

方式一: # 登錄git&#xff0c;新建git倉庫和指定的分支&#xff0c;如master、dev# 下載代碼&#xff0c;默認下載master分支 git clone http://10.*.*.67/performance_library/pfme-*.git # 切換到想要提交代碼的dev分支 git checkout dev# 添加想要提交的文件 git add .#…

.NET平臺用C#在PDF中創建可交互的表單域(Form Field)

在日常辦公系統開發中&#xff0c;涉及 PDF 處理相關的開發時&#xff0c;生成可填寫的 PDF 表單是一種常見需求&#xff0c;例如員工信息登記表、用戶注冊表、問卷調查或協議確認頁等。與靜態 PDF 不同&#xff0c;帶有**表單域&#xff08;Form Field&#xff09;**的文檔支持…

在macOS上安裝windows系統

使用Boot Camp 1. 準備工作&#xff1a;確認Mac滿足Boot Camp系統要求&#xff0c;準備好Windows安裝光盤或ISO映像文件&#xff0c;以及一個至少8GB的空白USB閃存驅動器用于保存驅動程序。 2. 打開Boot Camp助理&#xff1a;在“應用程序”文件夾的“實用工具”中找到“Boot…

683SJBH基于J2EE的廣州旅游管理系統

第1章  緒論 課題背景 自互聯網internet成為一種革命性的大眾媒體以來&#xff0c;其發展速度之快令人驚嘆。而作為世界最大朝陽產業的旅游&#xff0c;當它與電子商務這一新興模式相結合時&#xff0c;其潛藏的商業價值表露無遺。根據CNN&#xff08;美國有線電視新聞網&…

前端面試每日三題 - Day 27

這是我為準備前端/全棧開發工程師面試整理的第27天每日三題練習&#xff0c;涵蓋了&#xff1a; CSS選擇器的優先級與權重計算機制Angular中的依賴注入&#xff08;Dependency Injection&#xff09;機制設計一個支持實時協作編輯&#xff08;如Google Docs&#xff09;的前端…

PostgreSQL數據庫操作SQL

數據庫操作SQL 創建 創建數據庫 create database db_test;創建并指定相關參數 with owner : 所有者encoding : 編碼connection limit &#xff1a;連接限制 create database db_test1 with owner postgresencoding utf-8connection limit 100;修改 修改數據庫名稱 renam…