非交換排序-計數排序和桶排序
計數排序
空間複雜度:O(n)
時間複雜度: O(n)
穩定
當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 Θ(n + k)。計數排序不是比較排序,排序的速度快於任何比較排序演算法。
演算法的步驟如下:
- (1)找出待排序的陣列中最大和最小的元素
- (2)統計陣列中每個值為i的元素出現的次數,存入陣列C的第i項
- (3)對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加)
- (4)反向填充目標陣列:將每個元素i放在新陣列的第C(i)項,每放一個元素就將C(i)減去1
桶排序
空間複雜度:O(n)
時間複雜度: O(n)
穩定
桶排序是計數排序的升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。為了使桶排序更加高效,我們需要做到這兩點:
- 在額外空間充足的情況下,儘量增大桶的數量
- 使用的對映函式能夠將輸入的 N 個資料均勻的分配到 K 個桶中
什麼時候最快
當輸入的資料可以均勻的分配到每一個桶中。
元素分佈在桶中:
然後,元素在每個桶中排序:
public class BucketSort {
public static void main(String[] args) {
int[] arr = {5,8,6,2,4,3};
bucketSort(arr);
for (int i : arr) {
System.out.print(i+" ");
}
}
public static void bucketSort(int[] arr){
if (arr == null || arr.length < 2){
return;
}
int max = Integer.MIN_VALUE;
//遍歷找到最大值
for (int i = 0; i < arr.length; i++) {
max = Math.max(arr[i],max);
}
//因為考慮正整數,所以需要max+1個桶,一個桶代表一個數值,並不是範圍
int[] bucket = new int[max + 1];
// 放數入桶的操作,相同的數放在同一個桶中
for (int i = 0; i < arr.length; i++){
bucket[arr[i]]++;
}
int i = 0;
//按序遍歷桶即可,桶的計數就是對應數字出現的次數
for (int j = 0; j < bucket.length; j++) {
//此while迴圈輸出的是第j個桶存放的數字個j
while (bucket[j]-->0){
arr[i++] = j;
}
}
}
}
相關文章
- 桶排序和基數排序排序
- 計數排序vs基數排序vs桶排序排序
- 基於桶的排序之計數排序排序
- 【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)資料結構演算法排序
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- 桶排序排序
- 排序演算法__桶排序排序演算法
- 基於桶的排序之基數排序以及排序方法總結排序
- 【JS面試向】選擇排序、桶排序、氣泡排序和快速排序簡介JS面試排序
- 桶排序 選擇,插入排序排序
- 排序演算法之——桶排序排序演算法
- 桶排序2排序
- Java排序之計數排序Java排序
- 排序之交換排序排序
- 常用排序演算法之桶排序排序演算法
- 排序演算法__計數排序排序演算法
- 歸併排序和基數排序排序
- 計數排序排序
- 408 DataStructure_Algorithm - 8.3 交換排序ASTStructGo排序
- hive分桶表排序Hive排序
- 資料結構(python) —— 【18排序: 桶排序】資料結構Python排序
- 經常提及的幾個js排序方法(氣泡排序、選擇排序、計數排序)JS排序
- 1122. 陣列的相對排序(計數排序 / 自定義排序)陣列排序
- 選擇排序和快速排序排序
- 第三章:查詢與排序(下)----------- 3.20桶排序排序
- 15.百萬考生成績如何排序 - 計數排序排序
- 計數排序 - Counting Sort排序
- 排序演算法__基數排序排序演算法
- 排序演算法 - 氣泡排序和選擇排序排序演算法
- 三分鐘搞懂桶排序排序
- rust-algorithms:3-桶排序RustGo排序
- 選擇排序和氣泡排序排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- 排序:氣泡排序&快速排序排序
- 計數排序 -- GoLang實現排序Golang
- 什麼是計數排序?排序
- 堆排序和快速排序效能比較排序