計數排序和桶排序(Java實現)

2021-07-29 14:21:44 字數 3466 閱讀 6127

計數排序適用資料範圍

過程分析

網路流傳桶排序演算法勘誤

桶排序適用資料範圍

過程分析

常見的快速排序、歸併排序、堆排序、氣泡排序等屬於比較排序。在排序的最終結果裡,元素之間的次序依賴於它們之間的比較。每個數都必須和其他數進行比較,才能確定自己的位置。

在氣泡排序之類的排序中,問題規模為n,又因為需要比較n次,所以平均時間複雜度為o(n²)。在歸併排序、快速排序之類的排序中,問題規模通過分治法消減為logn次,所以時間複雜度平均o(nlogn)。

比較排序的優勢是,適用於各種規模的資料,也不在乎資料的分布,都能進行排序。可以說,比較排序適用於一切需要排序的情況。

計數排序、基數排序、桶排序則屬於非比較排序。非比較排序是通過確定每個元素之前,應該有多少個元素來排序。針對陣列arr,計算arr[i]之前有多少個元素,則唯一確定了arr[i]在排序後陣列中的位置。

非比較排序只要確定每個元素之前的已有的元素個數即可,所有一次遍歷即可解決。演算法時間複雜度o(n)。

非比較排序時間複雜度底,但由於非比較排序需要占用空間來確定唯一位置。所以對資料規模和資料分布有一定的要求。

計數排序適用資料範圍

計數排序需要占用大量空間,它僅適用於資料比較集中的情況。比如 [0~100],[10000~19999] 這樣的資料。

過程分析

計數排序的基本思想是:對每乙個輸入的元素arr[i],確定小於 arr[i] 的元素個數

所以可以直接把 arr[i] 放到它輸出陣列中的位置上。假設有5個數小於 arr[i],所以 arr[i] 應該放在陣列的第6個位置上。

下面給出兩種實現:

演算法流程(1)

需要三個陣列:

待排序陣列 int arr = new int;

輔助計數陣列 int help = new int[max - min + 1]; //該陣列大小為待排序陣列中的最大值減最小值+1

輸出陣列 int res = new int[arr.length];

1.求出待排序陣列的最大值max=6, 最小值min=1

2.例項化輔助計數陣列help,help陣列中每個下標對應arr中的乙個元素,help用來記錄每個元素出現的次數

3.計算 arr 中每個元素在help中的位置 position = arr[i] - min,此時 help = [1,0,2,1,1,1]; (3出現了兩次,2未出現)

4.根據 help 陣列求得排序後的陣列,此時 res = [1,3,3,4,5,6]

public static int countsort1(int arr)

intmax = integer.min_value;

intmin = integer.max_value;

//找出陣列中的最大最小值

for(int i = 0; i < arr.length; i++)

int help = new int[max];

//找出每個數字出現的次數

for(int i = 0; i < arr.length; i++)

intindex = 0;

for(int i = 0; i < help.length; i++)

}return arr;

}

演算法流程(2)

需要三個陣列:

待排序陣列 int arr = new int;

輔助計數陣列 int help = new int[max - min + 1]; //該陣列大小為待排序陣列中的最大值減最小值+1

輸出陣列 int res = new int[arr.length];

1.求出待排序陣列的最大值max=6, 最小值min=1

2.例項化輔助計數陣列help,help用來記錄每個元素之前出現的元素個數

3.計算 arr 每個數字應該在排序後陣列中應該處於的位置,此時 help = [1,1,4,5,6,7];

4.根據 help 陣列求得排序後的陣列,此時 res = [1,3,3,4,5,6]

public static int countsort2(int arr)

int help = new int[max - min + 1];

//找出每個數字出現的次數

for(int i = 0; i < arr.length; i++)

//計算每個數字應該在排序後陣列中應該處於的位置

for(int i = 1; i < help.length; i++)

//根據help陣列進行排序

int res = new int[arr.length];

for(int i = 0; i < arr.length; i++)

return res;

}

網路流傳桶排序演算法勘誤

網路各博文中流程的桶排序演算法實際上都是計數排序,並非標準的桶排序。有問題的文章:

經典排序演算法 - 桶排序bucket sort

桶排序演算法

排序演算法 之 桶排序

最快最簡單的排序演算法:桶排序

桶排序適用資料範圍

桶排序可用於最大最小值相差較大的資料情況,比如[9012,19702,39867,68957,83556,102456]。

但桶排序要求資料的分布必須均勻,否則可能導致資料都集中到乙個桶中。比如[104,150,123,132,20000], 這種資料會導致前4個數都集中到同乙個桶中。導致桶排序失效。

過程分析

桶排序的基本思想是:把陣列 arr 劃分為n個大小相同子區間(桶),每個子區間各自排序,最後合併

計數排序是桶排序的一種特殊情況,可以把計數排序當成每個桶裡只有乙個元素的情況。

1.找出待排序陣列中的最大值max、最小值min

2.我們使用 動態陣列arraylist 作為桶,桶裡放的元素也用 arraylist 儲存。桶的數量為(max-min)/arr.length+1

3.遍歷陣列 arr,計算每個元素 arr[i] 放的桶

4.每個桶各自排序

5.遍歷桶陣列,把排序好的元素放進輸出陣列

public static void bucketsort(int arr)

//桶數

int bucketnum = (max - min) / arr.length + 1;

arraylistinteger>> bucketarr = new arraylist<>(bucketnum);

for(int i = 0; i < bucketnum; i++)

//將每個元素放入桶

for(int i = 0; i < arr.length; i++)

//對每個桶進行排序

for(int i = 0; i < bucketarr.size(); i++)

system.out.println(bucketarr.tostring());

}

桶排序和計數排序

桶排序和計數排序 桶排序 bucket sort 或所謂的 箱排序,是乙個 排序演算法 工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的 排序演算法 或是以遞迴方式繼續使用桶排序進行排序 桶排序是 鴿巢排序 的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序...

排序演算法 桶排序和計數排序

桶排序 bucket sort 或所謂的箱排序,也是一種排序演算法。其工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序...

計數排序 桶排序和基數排序

當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的差加上1 這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如 計數排...