-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBucketSort.java
More file actions
66 lines (57 loc) · 1.7 KB
/
BucketSort.java
File metadata and controls
66 lines (57 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.ywh.sorting;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 桶排序
* [排序] [稳定排序]
*
* @author ywh
* @since 15/11/2019
*/
public class BucketSort {
/**
*
* @param bucket
*/
private void insertionSort(List<Integer> bucket) {
for (int i = 1; i < bucket.size(); i++) {
int j = i - 1, cur = bucket.get(i);
for (; j >= 0 && bucket.get(j) > cur; j--) {
bucket.set(j + 1, bucket.get(j));
}
bucket.set(j + 1, cur);
}
}
/**
* Time(avg): O(n+k), Time(worst): O(n^2), Space: O(n)
* k = bucketCount
*
* @param arr
*/
public void sort(int[] arr) {
// 计算取值范围
int max = arr[0], min = arr[0];
for (int num : arr) {
max = Math.max(max, num);
min = Math.min(min, num);
}
// 元素分桶(至少 1 个,假设分 10 个)
int bucketCount = Math.max(arr.length / 10, 1);
List<List<Integer>> buckets = new ArrayList<>(bucketCount);
for (int i = 0; i < bucketCount; i++) {
buckets.add(new ArrayList<>());
}
for (int num : arr) {
// 将 num 映射到 0 ~ 1 之间的浮点数,乘上 bucketCount 再取整即可。
buckets.get((int) ((num - min) / (max - min + 1.0) * bucketCount)).add(num);
}
for (int i = 0, k = 0; i < bucketCount; i++) {
// 对每个桶的元素排序,再放入原数组。
Collections.sort(buckets.get(i));
for (Integer num : buckets.get(i)) {
arr[k++] = num;
}
}
}
}