[排序算法]--桶排序的Java实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010853261/article/details/54933236

今天在刷leetcode的时候,在41题 First Missing Positive 发现了在排序算法中还有一个桶排序,顺便做个总结。

桶排序

关于桶排序先做几点说明:

1)桶排序是稳定的;
2)桶排序是常见排序算法中最快的一种,大多数情况下比快排和归并排序还要快
3)桶排序非常快但是也非常消耗空间,典型的以空间换时间,基本上是最耗内存的一种排序算法。

桶排序中:无序数组有个要求,就是成员隶属于固定(有限的)的区间,如范围为0-9

例如待排数字[6 2 4 1 5 9]

准备10个空桶,最大数个空桶

[6 2 4 1 5 9]           待排数组

[0 0 0 0 0 0 0 0 0 0]   空桶

[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

1)顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶,这个过程类似这样:空桶[ 待排数组[ 0 ] ] = 待排数组[ 0 ]

[6 2 4 1 5 9] 待排数组

[0 0 0 0 0 0 6 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

2)顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶

[6 2 4 1 5 9] 待排数组

[0 0 2 0 0 0 6 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

3,4,5,6省略,过程一样,全部入桶后变成下边这样

[6 2 4 1 5 9] 待排数组

[0 1 2 0 4 5 6 0 0 9] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

0表示空桶,跳过,顺序取出即可:1 2 4 5 6 9

示例源码:

public static int[] bucketSort(int[] nums, int maxNum){
    int[] sorted = new int[maxNum+1];

    for(int i=0; i<nums.length; i++){
        sorted[nums[i]] = nums[i];//把数据放到对应索引的位置
    }
    return sorted;
}

测试代码:

public static void main(String[] args) {
    int[] x = { 99, 65, 24, 47, 50, 88,33, 66, 67, 31, 18 };
    int[] sorted = bucketSort(x, 99);
    for (int i = 0; i < sorted.length; i++)
    {
        if (sorted[i] > 0)
            System.out.println(sorted[i]);
    }
}

输出:

18, 24, 31, 33, 47, 50, 65, 66, 67, 88, 99, 

本文完整代码的github地址:
https://github.com/leetcode-hust/leetcode/blob/master/louyuting/src/leetcode/Algorithm/BucketSort.java

阅读更多

没有更多推荐了,返回首页