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

来源:互联网 发布:外文数据库 编辑:程序博客网 时间:2024/06/08 20:05
桶排序:
 * 计数排序适合小范围的大量重复元素,而桶排序适合区间内尽可能随机的元素
 * 它的思想是:

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

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

这里,我是用了我自定义的有序单链表来保证每个桶内的元素有序,如果有疑问,可以参考这篇博客: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;    }}
这种排序算法实现起来比较繁琐,因此我在编写算法的时候总是感觉某些地方不太合适,但是这也是一种新的思想,值得学习