开发中常见的算法汇总之-桶排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cpongo4/article/details/89333880
#### 桶排序 - 核心思想 - 对待排数据按某种规则进行合理划分(限量的桶),每个桶中可以再继续分别进行排序 - 通过进行桶的划分从而对数据进行分治处理,运用**分治法思想** - 核心思想是通过空间换时间,桶划分的越多每个桶中数据越少排序越快但是占用空间越多 - 特性 - 待排数据具有一定均匀分布的规律,其规律依靠某个函数计算后将数据和桶最对应的映射(桶排序对要排序数据的要求是非常苛刻且数据范围不能太大) - 因为需要借助桶做额外空间存储,属于非原地排序 - 相同数据进行映射进相同的桶中,属于稳定排序 - 步骤 - 根据待排数据分布情况设置一定数量桶 - 根据一定函数规则将数据映射进对应的桶中 - 分别采用其他排序算法对桶进行排序 - 对有数据的桶取出后进行拼接合并 - 图解 006tNc79gy1g1v9rm73upg30sg0etx2r.gif - 示例 ```java package com.lyd.algorithm.sort; import com.lyd.utils.RandomUtils; import lombok.extern.slf4j.Slf4j; import java.util.Arrays; /** * 描述:桶排序 *

* - 根据待排数据分布情况设置一定数量桶 * - 根据一定函数规则将数据映射进对应的桶中 * - 分别采用其他排序算法对桶进行排序 * - 对有数据的桶取出后进行拼接合并 *

* * @author lyd Date 2019/4/7 ProjectName:datastructure-algo Version: 1.0 */ @Slf4j public class BucketSort { /** * 桶排序 * * @param data 待排数据集 * @return 排序后数据集 */ static int[] bucketSort(int[] data) { if (null == data || data.length < 1) { return data; } //找出待排序数列中最大值和最小值,通过最大元素和最小元素跨度值来计算需要多少个桶 int min = data[0]; int max = data[0]; for (int i = 1; i < data.length; i++) { if (data[i] < min) { min = data[i]; } if (data[i] > max) { max = data[i]; } } //都是相同元素 if (min == max) { return data; } //计算桶数量 int bucketCount = (int) ((Math.floor((max - min) / data.length)) + 1); //定义一个二维数组,存储每个桶和每个桶中对应的数据集(这里每个桶的容量也可以用链表来实现) int[][] buckets = new int[bucketCount][0]; log.info("call bucketSort length:{},min:{},max:{},bucketCount:{}", data.length, min, max, bucketCount); //将每个元素值情况计算后放入对应的桶中 for (int i = 0; i < data.length; i++) { //计算出元素映射桶的下标索引:当前元素和最小元素差 除 桶个数 取整 int bucketIndex = (int) (Math.floor((data[i] - min) / data.length)); //动态扩增桶大小 int[] temp = Arrays.copyOf(buckets[bucketIndex], buckets[bucketIndex].length + 1); temp[temp.length - 1] = data[i]; buckets[bucketIndex] = temp; } //针对桶中数据进行再排序 int sortIndex = 0; for (int i = 0; i < bucketCount; i++) { //采用快速排序 if (buckets[i].length > 0) { int[] temp = QuickSort.quickSort(buckets[i]); for (int j = 0; j < temp.length; j++) { data[sortIndex++] = temp[j]; } } } return data; } public static void main(String[] args) { // int[] sorts = new int[]{13, 15, 13, 5, 6, 11, 16, 20, 17, 12, 5, 6, 11, 16, 20, 17}; int[] sorts = RandomUtils.intArrays(4, 100); int[] result = bucketSort(sorts); log.info("sorts:{}", result);//[5, 5, 6, 6, 11, 11, 12, 13, 13, 15, 16, 16, 17, 17, 20, 20] } } ```

猜你喜欢

转载自blog.csdn.net/cpongo4/article/details/89333880
今日推荐