最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java算法之桶排序Bucket?Sort詳解

 更新時(shí)間:2023年10月31日 08:36:58   作者:Kant101  
這篇文章主要介紹了Java算法之桶排序Bucket?Sort詳解,桶排序(Bucket?Sort)又稱箱排序,是一種比較常用的排序算法,其算法原理是將數(shù)組分到有限數(shù)量的桶里,再對每個(gè)桶分別排好序,最后一次將每個(gè)桶中排好序的數(shù)輸出,需要的朋友可以參考下

1. 概述

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

2. 算法詳解

桶排序的思想就是把待排序的數(shù)盡量均勻地放到各個(gè)桶中,再對各個(gè)桶進(jìn)行局部的排序,最后再按序?qū)⒏鱾€(gè)桶中的數(shù)輸出,即可得到排好序的數(shù)。

1.首先確定桶的個(gè)數(shù)。因?yàn)橥芭判蜃詈檬菍?shù)據(jù)均勻地分散在各個(gè)桶中,那么桶的個(gè)數(shù)最好是應(yīng)該根據(jù)數(shù)據(jù)的分散情況來確定。首先找出所有數(shù)據(jù)中的最大值mx和最小值mn;

根據(jù)mx和mn確定每個(gè)桶所裝的數(shù)據(jù)的范圍 size,有 size = (mx - mn) / n + 1,n為數(shù)據(jù)的個(gè)數(shù),需要保證至少有一個(gè)桶,故而需要加個(gè)1;

求得了size即知道了每個(gè)桶所裝數(shù)據(jù)的范圍,還需要計(jì)算出所需的桶的個(gè)數(shù)cnt,有 cnt = (mx - mn) / size + 1,需要保證每個(gè)桶至少要能裝1個(gè)數(shù),故而需要加個(gè)1;

2.求得了size和cnt后,即可知第一個(gè)桶裝的數(shù)據(jù)范圍為 [mn, mn + size),第二個(gè)桶為 [mn + size, mn + 2 * size),…,以此類推 因此步驟2中需要再掃描一遍數(shù)組,將待排序的各個(gè)數(shù)放進(jìn)對應(yīng)的桶中。

3.對各個(gè)桶中的數(shù)據(jù)進(jìn)行排序,可以使用其他的排序算法排序,例如快速排序;也可以遞歸使用桶排序進(jìn)行排序;

4.將各個(gè)桶中排好序的數(shù)據(jù)依次輸出,最后得到的數(shù)據(jù)即為最終有序。

例子

例如,待排序的數(shù)為:3, 6, 9, 1

1)求得 mx = 9,mn = 1,n = 4 size = (9 - 1) / n + 1 = 3 cnt = (mx - mn) / size + 1 = 3

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

3)對各個(gè)桶中的數(shù)進(jìn)行排序,得到如下圖所示:

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

3. 測試

JAVA

import java.util.ArrayList;

/**
 * @author yumu
 * @date 2022/8/25
 */
public class BucketSort {

    public void bucketSort(int[] nums) {
        int n = nums.length;
        int mn = nums[0], mx = nums[0];
        // 找出數(shù)組中的最大最小值
        for (int i = 1; i < n; i++) {
            mn = Math.min(mn, nums[i]);
            mx = Math.max(mx, nums[i]);
        }
        int size = (mx - mn) / n + 1; // 每個(gè)桶存儲(chǔ)數(shù)的范圍大小,使得數(shù)盡量均勻地分布在各個(gè)桶中,保證最少存儲(chǔ)一個(gè)
        int cnt = (mx - mn) / size + 1; // 桶的個(gè)數(shù),保證桶的個(gè)數(shù)至少為1
        List<Integer>[] buckets = new List[cnt]; // 聲明cnt個(gè)桶
        for (int i = 0; i < cnt; i++) {
            buckets[i] = new ArrayList<>();
        }
        // 掃描一遍數(shù)組,將數(shù)放進(jìn)桶里
        for (int i = 0; i < n; i++) {
            int idx = (nums[i] - mn) / size;
            buckets[idx].add(nums[i]);
        }
        // 對各個(gè)桶中的數(shù)進(jìn)行排序,這里用庫函數(shù)快速排序
        for (int i = 0; i < cnt; i++) {
            buckets[i].sort(null); // 默認(rèn)是按從小打到排序
        }
        // 依次將各個(gè)桶中的數(shù)據(jù)放入返回?cái)?shù)組中
        int index = 0;
        for (int i = 0; i < cnt; i++) {
            for (int j = 0; j < buckets[i].size(); j++) {
                nums[index++] = buckets[i].get(j);
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = {19, 27, 35, 43, 31, 22, 54, 66, 78};
        BucketSort bucketSort = new BucketSort();
        bucketSort.bucketSort(nums);
        for (int num: nums) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

C++

#include <iostream>
#include <vector>

using namespace std;

class BucketSort {
public:
    void bucketSort(vector<int> &nums) {
        int n = nums.size();
        int mn = nums[0], mx = nums[0];
        for (int i = 1; i < n; i++) {
            mn = min(mn, nums[i]);
            mx = max(mx, nums[i]);
        }
        int size = (mx - mn) / n + 1;   // size 至少要為1
        int cnt = (mx - mn) / size + 1; // 桶的個(gè)數(shù)至少要為1
        vector<vector<int>> buckets(cnt);
        for (int i = 0; i < n; i++) {
            int idx = (nums[i] - mn) / size;
            buckets[idx].push_back(nums[i]);
        }
        for (int i = 0; i < cnt; i++) {
            sort(buckets[i].begin(), buckets[i].end());
        }
        int index = 0;
        for (int i = 0; i < cnt; i++) {
            for (int j = 0; j < buckets[i].size(); j++) {
                nums[index++] = buckets[i][j];
            }
        }
    }
};


int main() {
    vector<int> nums = {19, 27, 35, 43, 31, 22, 54, 66, 78};
    BucketSort().bucketSort(nums);
    for (auto num: nums) {
        cout << num << " ";
    }
    cout << endl;
    return 0;
}

4. 時(shí)間復(fù)雜度和空間復(fù)雜度分析

最好時(shí)間復(fù)雜度 : O(n + k) 其中k為桶的個(gè)數(shù)。即當(dāng)數(shù)據(jù)是均勻分散排列的,那么每個(gè)桶分到的數(shù)據(jù)個(gè)數(shù)都是一樣的,這個(gè)步驟需要O(k)的書劍復(fù)雜度,在對每個(gè)桶進(jìn)行排序的時(shí)候,最好情況下是數(shù)據(jù)都已經(jīng)是有序的了,那么最好的排序算法的時(shí)間復(fù)雜度會(huì)是O(n),因此總的時(shí)間復(fù)雜度是 O(n + k) 。

最壞時(shí)間復(fù)雜度:O(n^2) 當(dāng)對每個(gè)桶中的數(shù)據(jù)進(jìn)行排序的時(shí)候,所使用的排序算法,最壞情況下是O(n^2),因此總的最壞情況下的時(shí)間復(fù)雜度為O(n^2)。

平均時(shí)間復(fù)雜度:O(n + n²/k + k) <=> O(n) 如果k是根據(jù)Θ(n)來獲取的,那么平均時(shí)間復(fù)雜度就是 O(n)。

到此這篇關(guān)于Java算法之桶排序Bucket Sort詳解的文章就介紹到這了,更多相關(guān)Java桶排序Bucket Sort內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中string.trim()函數(shù)的作用實(shí)例及源碼

    java中string.trim()函數(shù)的作用實(shí)例及源碼

    這篇文章主要介紹了java中string.trim()函數(shù)的作用實(shí)例及源碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 基于@Autowired依賴注入的原理分析

    基于@Autowired依賴注入的原理分析

    這篇文章主要介紹了基于@Autowired依賴注入的原理分析,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • java中java.util.Date和java.sql.Date之間的轉(zhuǎn)換的示例

    java中java.util.Date和java.sql.Date之間的轉(zhuǎn)換的示例

    java.util.Date是java.sql.Date的父類,有時(shí)候在和SqlServer數(shù)據(jù)庫打交道時(shí),也會(huì)遇到,本文主要介紹了java中java.util.Date和java.sql.Date之間的轉(zhuǎn)換的示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • java實(shí)現(xiàn)自動(dòng)售貨機(jī)

    java實(shí)現(xiàn)自動(dòng)售貨機(jī)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)自動(dòng)售貨機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java獲取媒體文件時(shí)長的多種實(shí)現(xiàn)方法

    Java獲取媒體文件時(shí)長的多種實(shí)現(xiàn)方法

    本文主要介紹了Java獲取媒體文件時(shí)長的多種實(shí)現(xiàn)方法,包括使用第三方庫如ApacheCommonsIO、JAVE或FFmpeg,通過這些方法,可以方便地獲取不同媒體格式文件的時(shí)長,感興趣的可以了解一下
    2025-11-11
  • SpringBoot項(xiàng)目啟動(dòng)健康檢查的操作方法

    SpringBoot項(xiàng)目啟動(dòng)健康檢查的操作方法

    在現(xiàn)代的微服務(wù)架構(gòu)中,容器化技術(shù)已經(jīng)成為一種主流的部署方式,Docker 作為容器化技術(shù)的代表,提供了一種輕量級、可移植的解決方案,然而,僅僅將應(yīng)用容器化是不夠的,我們還需要確保這些容器在運(yùn)行時(shí)能夠保持健康狀態(tài),這就是健康檢查發(fā)揮作用的地方
    2024-12-12
  • IntelliJ IDEA各種圖標(biāo)的含義

    IntelliJ IDEA各種圖標(biāo)的含義

    這篇文章主要介紹了IntelliJ IDEA各種圖標(biāo)的含義,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask

    詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask

    這篇文章主要介紹了詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Spring Boot靜態(tài)資源路徑的配置與修改詳解

    Spring Boot靜態(tài)資源路徑的配置與修改詳解

    最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁”問題,通過查資料對SpringBoot訪問靜態(tài)資源做了總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • java中關(guān)于深拷貝的幾種方式總結(jié)

    java中關(guān)于深拷貝的幾種方式總結(jié)

    這篇文章主要介紹了java中關(guān)于深拷貝的幾種方式總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

临高县| 临高县| 民权县| 东兰县| 那曲县| 蕲春县| 尤溪县| 民和| 宽城| 武隆县| 怀远县| 武功县| 镇平县| 凤山县| 德保县| 新源县| 无极县| 泉州市| 金湖县| 元阳县| 松原市| 余姚市| 十堰市| 邹平县| 水城县| 龙陵县| 三河市| 中西区| 龙山县| 抚松县| 天峨县| 武义县| 治多县| 奉新县| 教育| 怀化市| 容城县| 巴青县| 禹城市| 德江县| 乌兰察布市|