1.桶排序
桶排序是将待排序的数据扔到按顺序排列的桶里,如下图:
其中每个桶都有按顺序的编号(桶就是数组,编号是数组的下标),将每个数放到编号与之对应的桶里,然后再将桶里的数依次拿出来便排号了序。缺点:如果需要对100、2、0进行排序,则需要创建一个大小为101(下标从0开始,见上图)的数组,造成了严重的空间浪费。
时间复杂度:
对于N个待排数据,M个桶:
平均时间复杂度:O(N+N*logN-N*logM)
最好情况下的时间复杂度:O(N),当N=M时,即极限情况下每个桶只有一个数据时。
如果相对于同样的N,桶数量M越大,其效率越高,最好是O(N)。当然桶排序的空间复杂度为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。
示例代码:
public class BucketSort {
public static void main(String[] args) {
int arr[] = {3, 1, 5, 3, 4};
bucketSort(arr);
}
static void bucketSort(int arr[]) {
//首先找出待排序数据的最大值
int max = 0;
for (int i = 0; i < arr.length; i++) {
if(max < arr[i]) {
max = arr[i];
}
}
//创建桶
int bucket[] = new int[max + 1];
//将数据放入桶
for (int i = 0; i < arr.length; i++) {
bucket[arr[i]]++;
}
//输出