複習一 陣列(8) 桶排序

2021-10-24 16:05:22 字數 2023 閱讀 7265

桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(θ(n))。但桶排序並不是 比較排序,他不受到 o(n log n) 下限的影響。

思路:

將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零

依次將各個元素的最低位、次低位、…、最高位取出,分配到對應的桶中(一維陣列)

從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。

演算法實現

設定乙個定量的陣列當作空桶

遍歷序列,依次把元素放到對應的桶中

對每個非空桶進行排序

將排序後的非空桶返回到原序列之中

public

static

void

bucketsort

(int

arr)

// 計算桶的數量

int bucketnum =

(max - min)

/ arr.length +1;

arraylist

> bucketarr =

newarraylist

<

>

(bucketnum)

;for

(int i =

0; i < bucketnum; i++

)// 將每個元素放入桶

for(

int i =

0; i < arr.length; i++

)// 對每個桶進行排序

for(

int i =

0; i < bucketarr.

size()

; i++

)// 將桶中的元素賦值到原序列

int index =0;

for(

int i =

0; i < bucketarr.

size()

; i++)}

}public

static

void

main

(string[

] args)

; system.out.

println

("原arr陣列:"

+ arrays.

tostring

(arr));

bucketsort

(arr)

; system.out.

println

("桶排序後arr為:"

+ arrays.

tostring

(arr));

}

執行結果:

時間複雜度:o(n+c)

對於待排序序列大小為 n,共分為 m 個桶,主要步驟有:

n 次迴圈,將每個元素裝入對應的桶中

m 次迴圈,對每個桶中的資料進行排序(平均每個桶有 n/m 個元素)

一般使用較為快速的排序演算法,時間複雜度為 o ( n l o g n ) o(nlogn) o(nlogn),實際的桶排序過程是以鍊錶形式插入的。

整個桶排序的時間複雜度為:

o ( n ) + o ( m ∗ ( n / m ∗ l o g ( n / m ) ) ) = o ( n ∗ ( l o g ( n / m ) + 1 ) ) o(n)+o(m*(n/mlog(n/m)))=o(n(log(n/m)+1)) o(n)+o(m∗(n/m∗log(n/m)))=o(n∗(log(n/m)+1))

當 n = m 時,複雜度為 o ( n ) o(n) o(n)

空間複雜度:o(n+m)

桶排序中,需要建立m個桶的額外空間,以及n個元素的額外空間

穩定性:

桶排序的穩定性取決於桶內排序使用的演算法

複習一 陣列(3) 選擇排序

選擇排序是一種簡單直觀的排序演算法。思路 首先在原數列中找到最小 or最大 的元素,然後將其存放到陣列的起始位置。再從剩餘未排序的元素中繼續尋找最小 or最大 的元素,然後放到已排序好的陣列的末尾。以此類推,直到全陣列排序完成。public class selectionsort system.ou...

複習一 陣列(6) 歸併排序

歸併排序是建立在歸併操作上的一種有效,穩定的排序演算法。該演算法是採用分治法的乙個非常典型的應用。歸併排序的實現由兩種方法 自上而下的遞迴 自下而上的迭代 思路 將這個陣列分成一半,直到每一部分 把左邊的陣列排序,右邊的陣列排序。當我們對左邊的陣列和右邊的素組進行排序的時候,再分別將左邊的陣列和右邊...

資料結構複習 線性表(一)陣列

include include define maxsize 20 struct lnode typedef struct lnode list 陣列線性表的指標重新命名 初始化乙個空表 list makeempty 查詢 在list線性表中查詢第乙個target元素的index int find ...