美文网首页数据结构already
桶排序(Bucket Sort)

桶排序(Bucket Sort)

作者: 小波同学 | 来源:发表于2022-03-15 00:57 被阅读0次

一、算法概述

1.1 算法分类

十种常见排序算法可以分为两大类:

  • 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。

  • 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

1.2 算法复杂度

1.3 相关概念

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
  • 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
  • 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
  • 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

二、桶排序(Bucket Sort)

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

2.1 算法描述

  • 设置一个定量的数组当作空桶;
  • 遍历输入数据,并且把数据一个一个放到对应的桶里去;
  • 对每个不是空的桶进行排序;
  • 从不是空的桶里把排好序的数据拼接起来。

2.2 图片演示

三、代码实现

import java.util.*;

/**
 * @Author: huangyibo
 * @Date: 2022/3/14 15:30
 * @Description: 桶排序
 */

public class BucketSort {

    public static void main(String[] args) {
        int[] arr = {220, 134, 0, 153, 2, 1314, 87, 2022, -8, -99};
        bucketSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void bucketSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        
        //建立桶,个数和待排序数组长度一样
        int len = arr.length;

        List<Integer>[] bucket = new LinkedList[len];
        // 找出待排序数组arr中的最大值
        int max = Arrays.stream(arr).max().getAsInt();

        //根据每个元素的值, 分配到对应范围的桶中
        for (int i = 0; i < arr.length; i++) {
            int index = toBucketIndex(arr[i], max, len);
            // 没有桶才建立桶(延时)
            if (bucket[index] == null) {
                bucket[index] = new LinkedList<>();
            }
            // 有桶直接使用
            bucket[index].add(arr[i]);
        }

        // 对每个非空的桶排序,排序后顺便存入临时的List,则list中已经有序)
        List<Integer> temp = new ArrayList<>();
        for (int i = 0; i < len; i++) {
            if (bucket[i] != null) {
                Collections.sort(bucket[i]);
                temp.addAll(bucket[i]);
            }
        }

        // 将temp中的数据写入原数组
        for (int i = 0; i < len; i++) {
            arr[i] = temp.get(i);
        }
    }

    /**
     * 映射函数,将值转换为应存放到的桶数组的索引
     * @param value
     * @param maxValue
     * @param length
     * @return
     */
    private static int toBucketIndex(int value, int maxValue, int length) {
        return (value * length) / (maxValue + 1);
    }
}

四、算法分析

桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

最佳情况:T(n) = O(n+k) 最差情况:T(n) = O(n+k) 平均情况:T(n) = O(n2)

参考:
https://www.cnblogs.com/onepixel/articles/7674659.html

https://blog.csdn.net/ThinkWon/article/details/101544356

相关文章

  • 排序(2)

    线性排序:Bucket sort,Counting sort,Radix sort 桶排序 数据能划分为m个桶,桶...

  • iOS 计数排序、基数排序、桶排序

      计数排序(Counting Sort)、基数排序(Radix Sort)、桶排序(Bucket Sort)适合...

  • 13|桶排序

    桶排序( Bucket sort )首先,我们来看桶排序。桶排序,顾名思义,会用到 “ 桶 ” ,核心思想是将要排...

  • 桶排序

    桶排序(BucketSort) 桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组...

  • 数组-桶排序

    采用桶排序方式对数组进行排序 桶排序百科:桶排序(Bucket Sort),或者所谓的箱排序是一种非比较排序.工作...

  • 排序算法(十一)桶排序

    排序算法(十一)桶排序   桶排序(Bucket sort)是计数排序改进版,同样属于非比较排序,该算法的基本思想...

  • 排序算法(3)- 桶排序、计数排序、基数排序

    桶排序(Bucket sort) 将要排序的数据分到几个有序的桶里,每个桶里面再单独进行排序,最后把每个桶里的数据...

  • 桶排序(Bucket Sort)

    引用:CSDN算法之美 海量数据 一年的全国高考考生人数为500 万,分数使用标准分,最低100 ,最高900 ,...

  • 桶排序 bucket sort

    桶排序 时间复杂度:线性介,平均、最好为O(n+k),最坏为0(n^2) 空间复杂度:O(n+k) 稳定性:稳定性...

  • 桶排序(Bucket Sort)

    1. 算法描述 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 ...

网友评论

    本文标题:桶排序(Bucket Sort)

    本文链接:https://www.haomeiwen.com/subject/rgtsdrtx.html