- 桶排序简介
- 实现(java)
- 复杂度和稳定性
1.桶排序简介
非比较排序, 分治的思想, 划分几个大小相同的桶, 每个桶自排序, 再合并所有的桶
2.实现(java)
public class BucketSort {
public static void main(String[] args) {
int[] arr = {40, 35, 5, 63, 21, 82, 96, 77, 52, 19};
System.out.println("原数组: " + Arrays.toString(arr));
sortArr(arr);
System.out.println("排序后: " + Arrays.toString(arr));
}
public static void sortArr(int[] arr) {
int max = arr[0];
int min = arr[0];
for(int i = 0; i < arr.length; i++) {
if(max < arr[i]) {
max = arr[i];
}
if(min > arr[i]) {
min = arr[i];
}
}
int bucket = arr.length / 4 + 1;
int range = (max - min + 1) / bucket + 1;
int[][] buckets = new int[bucket][];
for(int i = 0; i < arr.length; i++) {
int index = (arr[i] - min) / range;
buckets[index] = appendItem(buckets[index], arr[i]);
}
int k = 0;
for(int i = 0; i < buckets.length; i++) {
for(int j = 0; j < buckets[i].length; j++) {
arr[k++] = buckets[i][j];
}
}
}
public static int[] appendItem(int[] bucketArr, int item) {
if(bucketArr == null) {
return new int[]{item};
}
int[] tmpArr = Arrays.copyOf(bucketArr, bucketArr.length + 1);
// 插入排序
int i;
for(i = bucketArr.length - 1; i >= 0; i--) {
if(tmpArr[i] > item) {
tmpArr[i + 1] = tmpArr[i];
}else {
break;
}
}
tmpArr[i + 1] = item;
return tmpArr;
}
}
3.复杂度和稳定性
排序算法 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
桶排序 | O(n) | O(n2) | O(n+k) | O(n+k) | 稳定 |