排序算法(7)----桶排序

桶排序:
 * 计数排序适合小范围的大量重复元素,而桶排序适合区间内尽可能随机的元素
 * 它的思想是:

 * 把数据存在的区间划分为小的区间,就像桶一样,这些在一个桶中的数据在桶内排好序,再合并成排序后的元素

如果大家知道散列表的拉链法,就可以大致的明白这个桶排序是一个什么样子的状态了.

这里,我是用了我自定义的有序单链表来保证每个桶内的元素有序,如果有疑问,可以参考这篇博客:http://blog.csdn.net/weixin_35757704/article/details/78005383


全部代码:

package com.sort;

import com.list.OrderedList;

/**
 * 桶排序:
 * 计数排序适合小范围的大量重复元素,而桶排序适合区间内尽可能随机的元素
 * 它的思想是:
 * 把数据存在的区间划分为小的区间,然后将这些数据在小区间内排好序,再合并成排序后的元素
 */
public class BucketSort {
    public static int[] bucketSort(int[] arr) {
        //找到最大值与最小值,得到分布的区间
        int min = arr[0];
        int max = arr[0];
        for (int anArr : arr) {
            if (anArr > max) {
                max = anArr;
            } else if (anArr < min) {
                min = anArr;
            }
        }
        //得到最大值后,就可以划分区间了,这里我把它分为10个区间
        int part = 10;
        //这里对step进行改造,防止数组下标越界
        while ((max - min) % part != 0) {
            max += 1;
        }
        int step = (max - min) / part;
        return bucketSort(arr, step, part);
    }

    private static int[] bucketSort(int[] arr, int step, int part) {
        OrderedList[] lists = new OrderedList[part];  //开辟新的数组空间,用来保存链表
        for (int i = 0; i < arr.length; i++) {
            lists[i] = new OrderedList();
        }
        //现在开始遍历整个待排数组,并且把它们有序的排在 lists 中
        for (int anArr : arr) {
            lists[anArr / step].insert(anArr);
        }
        //输出
        int index = 0;
        int[] resultArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            int count = lists[i].getCount();
            for (int j = 0; j < count; j++) {
                resultArr[index] = lists[i].popFirst();
                index++;
            }
        }
        return resultArr;
    }
}
这种排序算法实现起来比较繁琐,因此我在编写算法的时候总是感觉某些地方不太合适,但是这也是一种新的思想,值得学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值