景兄弟手撕算法之桶排序

package test1;

import java.util.ArrayList;
import java.util.List;

public class BucketSort {
    /**
     * 核心思想是将要排序的数列到几个有序的桶里,每个桶里的数据再进行单独排序,排序完成后,再依次取出每个桶的数据,就是有序数列。
     */

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(5);
        list.add(2);
        list.add(6);
        list.add(9);
        list.add(0);
        list.add(3);
        list.add(4);
        System.out.println(list);
        list =  bucketSort(list,2);
        System.out.println(list);
    }

    public static List<Integer> bucketSort(List<Integer> array,int bucketSize){
        //合法性校验
        if(array ==null || array.size()<2||bucketSize<1){
            return array;
        }
        //找出集合中最大值和最小值
        int max = array.get(0);
        int min = array.get(0);
        for(int i=0;i<array.size();i++){
            if(array.get(i)>max){
                max = array.get(i);
            }

            if (array.get(i)<min){
                min = array.get(i);
            }
        }

        //计算桶的个数 [集合中的min--》集合中的max],表示我们待排序的范围
        int bucketCount = (max-min)/bucketSize+1;
        //按照顺序建桶,创建一个list,list带下标是有序的,list中的每一个元素是一个桶
        List<List<Integer>> bucketList = new ArrayList<>();
        for(int i=0;i<bucketCount;i++){
            bucketList.add(new ArrayList<Integer>());
        }
        //将排序的集合一次性添加到对应的桶中
        for (int j=0;j<array.size();j++){
            int bucketIndex = (array.get(j)-min)/bucketSize;
            bucketList.get(bucketIndex).add(array.get(j));
        }

        //桶内元素的排序
        List<Integer> reusList = new ArrayList<>();
        for (int j=0;j<bucketList.size();j++){
            List<Integer> everyBucket = bucketList.get(j);
            if(everyBucket.size()>0){
                if (bucketCount == 1){
                    bucketSize--;
                }
                List<Integer> tmp = bucketSort(everyBucket,bucketSize);
                for (int i=0;i<tmp.size();i++){
                    reusList.add(tmp.get(i));
                }
            }
        }

        return reusList;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章