国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【算法】桶排序(Bucket Sort)詳解

這篇具有很好參考價值的文章主要介紹了【算法】桶排序(Bucket Sort)詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 概述

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

2. 算法詳解

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

  1. 首先確定桶的個數(shù)。因為桶排序最好是將數(shù)據(jù)均勻地分散在各個桶中,那么桶的個數(shù)最好是應(yīng)該根據(jù)數(shù)據(jù)的分散情況來確定。首先找出所有數(shù)據(jù)中的最大值mx和最小值mn;

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

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

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

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

  4. 將各個桶中排好序的數(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個桶,每個桶能放3個數(shù),第一個桶數(shù)的范圍為 [1, 4),第二個[4, 7),第三個[7, 10)
掃描一遍待排序的數(shù),將各個數(shù)放到其對應(yīng)的桶中,放完后如下圖所示:
桶排序,算法,算法,桶排序

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

4)依次輸出各個排好序的桶中的數(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; // 每個桶存儲數(shù)的范圍大小,使得數(shù)盡量均勻地分布在各個桶中,保證最少存儲一個
        int cnt = (mx - mn) / size + 1; // 桶的個數(shù),保證桶的個數(shù)至少為1
        List<Integer>[] buckets = new List[cnt]; // 聲明cnt個桶
        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]);
        }
        // 對各個桶中的數(shù)進(jìn)行排序,這里用庫函數(shù)快速排序
        for (int i = 0; i < cnt; i++) {
            buckets[i].sort(null); // 默認(rèn)是按從小打到排序
        }
        // 依次將各個桶中的數(shù)據(jù)放入返回數(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; // 桶的個數(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. 時間復(fù)雜度和空間復(fù)雜度分析

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

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

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


5. 參考文獻(xiàn)

[1] https://iq.opengenus.org/time-and-space-complexity-of-bucket-sort/
[2] https://www.programiz.com/dsa/bucket-sort文章來源地址http://www.zghlxwxcb.cn/news/detail-820775.html

到了這里,關(guān)于【算法】桶排序(Bucket Sort)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 排序算法(stable_sort(), sort())

    sort函數(shù)我相信大家都不陌生,今天介紹一個新的排序算法stable_sort stable_sort:穩(wěn)定排序算法,維持相等元素的原有順序。 假如我們定義一個字符串?dāng)?shù)組 這些字符串是按照字典序排列的,我們現(xiàn)在想要words按照單詞長度從小到大重排的同時,還希望具有相同長度的元素按照字典

    2024年02月07日
    瀏覽(23)
  • 【排序算法】堆排序(Heap Sort)

    【排序算法】堆排序(Heap Sort)

    堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。堆是一個近似完全二叉樹的結(jié)構(gòu),并同時滿足堆積的性質(zhì):即子結(jié)點的鍵值或索引總是小于(或者大于)它的父節(jié)點。 學(xué)習(xí)堆排序之前,有必要了解堆!若讀者不熟悉堆,建議先了解堆(建議可以通過二叉堆,左傾堆,

    2024年02月01日
    瀏覽(21)
  • 46,排序算法sort

    排序算法sort 常用排序算法 sort 學(xué)習(xí)目標(biāo): 掌握i常用排序算法 算法簡介: sort //對容器內(nèi)元素進(jìn)行排序 random_shuffle //洗牌,指定范圍內(nèi)的元素隨機(jī)調(diào)整次序 merge //容器元素合并,并存儲到另一容器中 reverse //反轉(zhuǎn)指定范圍的元素 功能描述: 對容器內(nèi)元素進(jìn)行排序 函數(shù)原型:

    2024年02月16日
    瀏覽(28)
  • C++(15): STL算法:排序(sort)

    ????????std::sort?是 C++ 標(biāo)準(zhǔn)庫 algorithm?中提供的一個函數(shù),用于對容器(如數(shù)組、向量等)中的元素進(jìn)行排序。它基于比較操作對元素進(jìn)行排序,通常使用高效的排序算法,如快速排序、歸并排序或堆排序等。 ????????在實際應(yīng)用中,std::sort?通常會根據(jù)輸入數(shù)據(jù)的大

    2024年04月12日
    瀏覽(30)
  • 算法 - 歸并排序(Merge_sort)

    算法 - 歸并排序(Merge_sort)

    目錄 什么是歸并排序(Merging_sort)? 歸并排序的適用場景: 演示歸并排序的過程(默認(rèn)arr和brr兩個數(shù)組都是有序的): 代碼實現(xiàn): 如果我們事先并沒有分配好兩個已經(jīng)排序好的數(shù)組,而是直接的一個無序序列呢? 代碼實現(xiàn): 在寫歸并排序的代碼之前,我們先對歸并排序的定義

    2024年02月13日
    瀏覽(18)
  • 算法 - 快速排序(Quick_sort)

    算法 - 快速排序(Quick_sort)

    目錄 什么是快速排序? 快速排序的使用場景: 演示快速排序的過程: 第一趟排序: 第二趟排序: 通過代碼來實現(xiàn): ?對快速排序的總結(jié): 在寫快速排序的代碼之前,我們先對快速排序的排序原理以及定義進(jìn)行梳理: 快速排序(Quick_sort)是對冒泡排序的一種改進(jìn),它也是

    2024年02月10日
    瀏覽(26)
  • 原生JS之sort排序方法詳解

    原生JS之sort排序方法詳解

    在JavaScript中排序主要用到的api就是sort了,但是使用sort有幾個坑需要注意,讓我們一起來看看 sort() 方法用于對 數(shù)組 的元素進(jìn)行排序。排序順序可以是字母或數(shù)字,并按升序或降序。 默認(rèn)排序順序為按字典升序。 在不使用參數(shù)時,sort使用的是字典排序 如果數(shù)組中元素都是

    2024年02月03日
    瀏覽(23)
  • 圖解快排——快速排序算法(quick sort)

    圖解快排——快速排序算法(quick sort)

    算法思想 快速排序算法是對冒泡排序算法的一種改進(jìn)算法,在當(dāng)前所有內(nèi)部排序算法中,快速排序算法被認(rèn)為是最好的排序算法之一。 快速排序的基本思想: 通過一趟排序?qū)⒋判虻男蛄蟹指顬樽笥覂蓚€子序列,左邊的子序列中所有數(shù)據(jù)都比右邊子序列中的數(shù)據(jù)小,然后對

    2024年01月16日
    瀏覽(29)
  • python算法 之 快速排序(Quick Sort)

    時間復(fù)雜度 名稱 示例算法 O(1) 常數(shù)時間復(fù)雜度 哈希表查找 O(logn) 對數(shù)時間復(fù)雜度 二分查找 O(n) 線性時間復(fù)雜度 遍歷數(shù)組 O(nlogn) 線性對數(shù)時間復(fù)雜度 快速排序 O(n^2) 平方時間復(fù)雜度 冒泡排序、插入排序 O(n^3) 立方時間復(fù)雜度 矩陣乘法 O(2^n) 指數(shù)時間復(fù)雜度 窮舉搜索 O(n!) 階

    2024年02月04日
    瀏覽(23)
  • JS中數(shù)組隨機(jī)排序?qū)崿F(xiàn)(原地算法sort/shuffle算法)

    JS中數(shù)組隨機(jī)排序?qū)崿F(xiàn)(原地算法sort/shuffle算法)

    ??個人主頁: 不叫貓先生 ???♂?作者簡介:專注于前端領(lǐng)域各種技術(shù),熱衷分享,期待你的關(guān)注。 ??系列專欄:vue3從入門到精通 ??個人簽名:不破不立 在談sort之前,我們先了解一下原地算法,什么事原地算法呢?所謂 原地算法 就是說基于原有的數(shù)據(jù)結(jié)構(gòu)進(jìn)行一定的

    2023年04月08日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包