欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java排序算法之桶排序詳解

 更新時間:2023年10月30日 09:31:57   作者:哇哈哈水有點甜  
這篇文章主要介紹了Java排序算法之桶排序詳解,桶排序是將數(shù)組中的元素放到一個一個的桶中,每個桶(bucket)代表一個區(qū)間,里面可以承載一個或者多個元素,然后將桶內(nèi)的元素進行排序,再按順序遍歷桶,輸出桶內(nèi)元素,需要的朋友可以參考下

Java排序算法之桶排序

概念:桶排序是將數(shù)組中的元素放到一個一個的桶中,每個桶(bucket)代表一個區(qū)間,里面可以承載一個或者多個元素。然后將桶內(nèi)的元素進行排序,再按順序遍歷桶,輸出桶內(nèi)元素。

時間復(fù)雜度:O(n+m+n(logn-logm)) (n代表數(shù)組長度,m代表桶數(shù),當(dāng)n=m時,時間復(fù)雜度為O(n))

空間復(fù)雜度:O(m+n)

缺點:如果數(shù)組中除了最后一個元素全部都在第一個桶中,那么查詢的時間復(fù)雜度會退化為O(nlogn),而且中間白白創(chuàng)建了許多空桶。

在這里插入圖片描述

代碼實現(xiàn)(java)

public static void main(String[] args) {
    double[] arr = new double[]{4.12, 6.421, 0.0023, 3.0, 2.123, 8.122, 4.12, 10.09};
    bucketSort(arr);
    for (double v : arr) {
        System.out.println(v);
    }


}


public static void bucketSort(double[] arr) {
    //1.取出數(shù)組中的最大值和最小值
    double max = Double.MIN_VALUE;
    double min = Double.MAX_VALUE;
    for (int i = 0; i < arr.length - 1; i++) {
        if (arr[i] < min) {
            min = arr[i];
        }
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    //2.初始化桶
    //桶的數(shù)量
    int bucketNum = arr.length;
    //每個桶的區(qū)間跨度
    double span = (max - min + 1) / bucketNum;
    ArrayList<LinkedList<Double>> bucketList = new ArrayList<LinkedList<Double>>(bucketNum);
    //在桶列表中添加元素個數(shù)的空桶
    for (int i = 0; i < bucketNum; i++) {
        bucketList.add(new LinkedList<Double>());
    }
    //3.遍歷原始數(shù)組,將每個元素放入桶中
    for (int i = 0; i < arr.length; i++) {
        //獲取桶的下標
        int num = (int) Math.floor((arr[i] - min) / span);//這里計算的結(jié)果是第幾個桶,用Math.floor取到桶的下標,比如計算結(jié)果是2.5,說明應(yīng)該放到第三個桶中,下標為2
        bucketList.get(num).add(arr[i]);
    }
    //4.對桶內(nèi)元素進行排序
    for (int i = 0; i < bucketList.size(); i++) {
        Collections.sort(bucketList.get(i));
    }
    //5.輸出全部元素
    double[] sortArray = new double[arr.length];
    int index = 0;
    for (LinkedList<Double> list : bucketList) {
        for (Double aDouble : list) {
            sortArray[index] = aDouble;
            index++;
        }
    }
}

時間復(fù)雜度:假設(shè)數(shù)組長度為n,桶數(shù)為m

  • 第一步求數(shù)列最大最小值,運算量為n。
  • 第二步創(chuàng)建空桶,運算量為m。
  • 第三步遍歷原始數(shù)列,運算量為n。
  • 第四步在每個桶內(nèi)部做排序,由于使用了O(nlogn)的排序算法,所以運算量為 n/m* log(n/m ) * m。
  • 第五步輸出排序數(shù)列,運算量為n。加起來,總的運算量為 3n+m+n/m* log(n/m ) * m = 3n+m+n(logn-logm) 。

去掉系數(shù),時間復(fù)雜度為:O(n+m+n(logn-logm)) 當(dāng)n=m時,時間復(fù)雜度可以達到O(N)

空間復(fù)雜度:空桶占用的空間 + 數(shù)列在桶中占用的空間 = O(m+n)

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

相關(guān)文章

  • 深入了解Java中Volatile關(guān)鍵字

    深入了解Java中Volatile關(guān)鍵字

    這篇文章主要介紹了Java中Volatile關(guān)鍵字的相關(guān)知識,文章講解非常詳細,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 結(jié)合線程池實現(xiàn)apache?kafka消費者組的誤區(qū)及解決方法

    結(jié)合線程池實現(xiàn)apache?kafka消費者組的誤區(qū)及解決方法

    這篇文章主要介紹了結(jié)合線程池實現(xiàn)apache?kafka消費者組的誤區(qū)及解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Java實現(xiàn)TCP和UDP協(xié)議詳解

    Java實現(xiàn)TCP和UDP協(xié)議詳解

    這篇文章主要介紹了Java實現(xiàn)TCP和UDP協(xié)議詳解,TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)是兩種最常用的傳輸層協(xié)議,它們都用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù),但是它們之間有很多不同之處,需要的朋友可以參考下
    2023-07-07
  • Spring MVC保證Controller并發(fā)安全的方法小結(jié)

    Spring MVC保證Controller并發(fā)安全的方法小結(jié)

    在 Spring MVC 中,默認情況下,@Controller 是單例的,這意味著所有請求共享一個 Controller 實例,為確保并發(fā)安全,Spring 并不會自動對 Controller 進行線程安全保護,本文給大家介紹了Spring MVC保證Controller并發(fā)安全的方法,需要的朋友可以參考下
    2024-11-11
  • Swagger2配置Security授權(quán)認證全過程

    Swagger2配置Security授權(quán)認證全過程

    這篇文章主要介紹了Swagger2配置Security授權(quán)認證全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 利用Java Set 去除重復(fù)object的方法

    利用Java Set 去除重復(fù)object的方法

    下面小編就為大家?guī)硪黄肑ava Set 去除重復(fù)object的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java多線程編程中線程鎖與讀寫鎖的使用示例

    Java多線程編程中線程鎖與讀寫鎖的使用示例

    這篇文章主要介紹了Java多線程編程中線程鎖與讀寫鎖的使用示例,鎖是控制程序多線程并發(fā)的重要手段,需要的朋友可以參考下
    2016-04-04
  • Spring Boot 配置和使用多線程池的實現(xiàn)

    Spring Boot 配置和使用多線程池的實現(xiàn)

    這篇文章主要介紹了Spring Boot 配置和使用多線程池的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Spring(一):IOC如何推導(dǎo)和理解

    Spring(一):IOC如何推導(dǎo)和理解

    下面小編就為大家?guī)硪黄斦凷pring對IOC的理解(推薦篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • spring單例如何改多例

    spring單例如何改多例

    這篇文章主要介紹了spring單例如何改多例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論