1.基本思想

桶排序是将待排序集合中处于同一个值域的元素存放在同一个桶中1

2.算法设计2

假设有一个班级有5个人,这次期末他们分别考了5分,2分,4分,5分,8分(满分为10分)。需要将这些分数从小到大排序

首先我们申请一个大小为11的数组int bucket[11]。在最开始的时候我们都把该数组的元素bucket[0]~bucket[10]都初始化为0,表示这些分数都还没有人得到过。例如bucket[0]表示的是目前还没有人得到0分,bucket[8]表示的是目前还没有人得到8分。

  1. 开始处理每一个分数。第一个人的分数为5分,那么就将bucket[5]的值在原来的基础上加1,即bucket[5]的值从0变为1,表示5分出现过一次
  2. 第二个人的分数为2分,那么就将bucket[2]的值在原来的基础上加1,即bucket[2]的值从0变为1,表示2分出现过一次
  3. 第三个人的分数为4分,以此类推,可得
  4. 第四个人的分数为5分,注意了,我们在bucket[5]的值在原来的基础上加1,那么bucket[5]的值从1变为2,表示5分出现两次
  5. 最后一个人的分数为8分,得

    最终,只需要将出现过的分数打印出来

3.代码

public class SimpleBucketSort {
public static void main(String[] args) {
// 下面是学生取得的分数,假设分数最大为10
int[] a = {5,3,5,2,8};
// 创建11个分数层,a[0]=0:表示分数为0分的出现0个人
int[] bucket = new int[11];
for(int i = 0; i < a.length; i++) {
// 出现分数为a[i]的有barrel[a[i]]个人
bucket[a[i]]++;
}
// 打印
for (int i = 0; i < bucket.length; i++) {
// 出现几次就打印几次
for(int j = 1; j <= bucket[i]; j++) {
System.out.print(i + " ");
}
}
}
}

4.复杂度

  • 时间复杂度

在初始化桶时,需要循环n次(n为桶的个数,在java语言中默认都已经初始化为0),在把分数放入桶中时,循环了m次(m为待排序的个数),而在打印时一共循环了(m+n)次,所以整个排序算法一共执行了(n+m+m+n)次。用大写的O来表示时间复杂度,因此该算法的时间复杂度为O(n+m+m+n),即O(2(n+m))。但是一般在说时间复杂度时都是忽略常数,也就是桶排序的最终时间复杂度为O(m+n),并且一般字母都得大写表示,即O(M+N)。

  • 空间复杂度

桶排序所占用的空间比较糟糕,非常浪费空间,如果要排序的数的范围在0~10000000000000,那得创建出10000000000001个变量。创建N个桶,并且待排序的数为M,那么空间复杂度为O(N+M)。

5.优缺点

  • 优点

速度是比较快的,从上面的时间复杂度可以看出。

  • 缺点

比较浪费空间,假设待排序的数中有一个元素值为2100000000000,那么必须创建一个大于2100000000000的桶数。

6.思考

  • 该算法其实可以来做去重复元素,只需要在打印时做一点改动。
// 打印(去重)
for(int i = 0; i < barrel.length; i++) {
if(barrel[i] != 0) {
// 打印的是分数
System.out.print(i + " ");
}
}
  • 目前使用桶排序来对分数进行排序,那么目前要是姓名和分数,要求将名字按分数从小到大排序后打印输出,目前的简单桶排序做不到,输出的只能是分数。

  1. 参考博客:https://www.jianshu.com/p/204ed43aec0c ↩︎

  2. 参考书籍:《啊哈!算法》 ↩︎

简单桶排序(Bucket Sort)的更多相关文章

  1. 桶排序bucket sort

    桶排序 (Bucket sort)或所谓的箱排序的原理是将数组分到有限数量的桶子里,然后对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的 ...

  2. 计数排序与桶排序(bucket sort)

    Bucket Sort is a sorting method that subdivides the given data into various buckets depending on cer ...

  3. 算法-桶排序(Bucket sort)

    本文由@呆代待殆原创,转载请注明出处. 简介:这个排序算法不属于比较排序,在平均情况下他的时间代价是O(n),并且它假设它的输入数据均匀的分布在一个固定的区间里. 思路:桶排序假设他的输入均匀的分布在 ...

  4. 桶排序(bucket sort)

    Bucket Sort is a sorting method that subdivides the given data into various buckets depending on cer ...

  5. 排序:桶排序Bucket sort

    补充说明三点 1,桶排序是稳定的 2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 无序数组有个要求,就是成员隶属于 ...

  6. 桶排序Bucket sort(转)

    补充说明三点 1,桶排序是稳定的 2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 我自己的理解哈,可能与网上说的有 ...

  7. c++简单桶排序

    c++简单桶排序 题目一样,还是排序 桶排序是排序算法里比较快的 代码 + 注释 #include <bits/stdc++.h> using namespace std; int mai ...

  8. 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort

    选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...

  9. 简单桶排序算法-python实现

    #-*- coding: UTF-8 -*- import numpy as np def BucketSort(a, n): barrel = np.zeros((1, n), dtype = 'i ...

随机推荐

  1. Shashlik Cooking

    Long story short, shashlik is Miroslav's favorite food. Shashlik is prepared on several skewers simu ...

  2. sysbench下载与安装

    目标:下载.安装sysbench软件,做数据库压测 准备: 在sysbench启动的linux机器上,首先安装好mysql,查看mysql已经启动 例如,在机器上已经安装完mysql,其路径为 /us ...

  3. pve apt-get update error 升级报错-文章未完工和验证

    pve: apt-get update error 升级报错 提示如下报错 Hit: http://security.debian.org buster/updates InRelease Hit: ...

  4. C语言-指针深度分析

    1.变量回顾 程序中的变量只是—段存储空间的别名,那么是不 是必须通过这个别名才能使用这段存储空间? 2.思考 下面的程序输出什么?为什么? ;    int* p = &i;       p ...

  5. RESTful 【个人理解总结】

    RESTful 个人理解总结 一.什么是  RESTful 面向资源 简单的说:RESTful是一种架构的规范与约束.原则,符合这种规范的架构就是RESTful架构. 先看REST是什么意思,英文Re ...

  6. Wooden Sticks(贪心)

    Wooden Sticks. win the wooden spoon:成为末名. 题目地址:http://poj.org/problem?id=1065 There is a pile of n w ...

  7. C变量常量

    变量是指其值可以变化的量.计算机中,指令代码.数据都存储于内存中.变量也需要存储在内存中.在计算机中,每个变量都被分配了一块内存空间,在这些空间里存储的就是变量的值.变量之所以可以变化,就是这个存储空 ...

  8. 实现简单的 JS 模块加载器

    实现简单的 JS 模块加载器 1. 背景介绍 按需加载是前端性能优化的一个重要手段,按需加载的本质是从远程服务器加载一段JS代码(这里主要讨论JS,CSS或者其他资源大同小异),该JS代码就是一个模块 ...

  9. 2 request的get和post方法

    requests的get方法 1 在百度里面查询关键字的方法,并获取带百度当前页面 import requests keywords = input('请输入>>>').strip( ...

  10. C++-HDU2196-Computer-[树的直径]

    直径定义:树上的最长路径,不妨设端点分别为s,t 可以证明(感觉):每个点到其最远点必定为s or t,反之亦然 首先,第一次dfs找到s 然后,第二次dfs以s为根找到t 最后,第三次dfs以t为根 ...