简单桶排序(Bucket Sort)
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分。
- 开始处理每一个分数。第一个人的分数为5分,那么就将bucket[5]的值在原来的基础上加1,即bucket[5]的值从0变为1,表示5分出现过一次
- 第二个人的分数为2分,那么就将bucket[2]的值在原来的基础上加1,即bucket[2]的值从0变为1,表示2分出现过一次
- 第三个人的分数为4分,以此类推,可得
- 第四个人的分数为5分,注意了,我们在bucket[5]的值在原来的基础上加1,那么bucket[5]的值从1变为2,表示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 + " ");
- }
- }
- 目前使用桶排序来对分数进行排序,那么目前要是姓名和分数,要求将名字按分数从小到大排序后打印输出,目前的简单桶排序做不到,输出的只能是分数。
简单桶排序(Bucket Sort)的更多相关文章
- 桶排序bucket sort
桶排序 (Bucket sort)或所谓的箱排序的原理是将数组分到有限数量的桶子里,然后对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的 ...
- 计数排序与桶排序(bucket sort)
Bucket Sort is a sorting method that subdivides the given data into various buckets depending on cer ...
- 算法-桶排序(Bucket sort)
本文由@呆代待殆原创,转载请注明出处. 简介:这个排序算法不属于比较排序,在平均情况下他的时间代价是O(n),并且它假设它的输入数据均匀的分布在一个固定的区间里. 思路:桶排序假设他的输入均匀的分布在 ...
- 桶排序(bucket sort)
Bucket Sort is a sorting method that subdivides the given data into various buckets depending on cer ...
- 排序:桶排序Bucket sort
补充说明三点 1,桶排序是稳定的 2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 无序数组有个要求,就是成员隶属于 ...
- 桶排序Bucket sort(转)
补充说明三点 1,桶排序是稳定的 2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 我自己的理解哈,可能与网上说的有 ...
- c++简单桶排序
c++简单桶排序 题目一样,还是排序 桶排序是排序算法里比较快的 代码 + 注释 #include <bits/stdc++.h> using namespace std; int mai ...
- 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort
选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...
- 简单桶排序算法-python实现
#-*- coding: UTF-8 -*- import numpy as np def BucketSort(a, n): barrel = np.zeros((1, n), dtype = 'i ...
随机推荐
- Linux - Shell - 免密码登录
概述 简述 linux ssh 无密码登录 无能狂怒 最近真是不知道写啥了 环境 os centos7 1. 场景 场景 主机A 需要经常访问 主机B 每次访问, 都要输入一次 密码 问题 每次都输密 ...
- Codeforces Round #623 (Div. 1, based on VK Cup 2019-2020 - Elimination Round, Engine)A(模拟,并查集)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; pair<]; bool cmp( ...
- Spectral clustering谱聚类
Basic knowledge: degree matrix; similarity matrix, and Adjacency matrix; 无向带权图模型 G=<V,E>G=< ...
- 三分钟快速上手TensorFlow 2.0 (下)——模型的部署 、大规模训练、加速
前文:三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署 TensorFlow 模型导出 使用 SavedModel 完整导出模型 不仅包含参数的权值,还包含计算的流程(即计算 ...
- android 代码设置图标背景色(圆形图标)和图标颜色
原图: 1.改变图标颜色: mImageView.setColorFilter(Color.parseColor("#ff0000")); 效果: 2.改变图标背景色(主要是圆形图 ...
- SpringBoot整合WEB开发--(一)处理JSON返回数据
1.使用默认的json转换HttpessageConverter Json是目前主流的前后端数据传输方式,SpringMVC中使用消息转化器HttpMessageConverter对JSON的转换提供 ...
- IntelliJ IDEA 2017.3尚硅谷-----断点调试
- beego 页面布局
模板 this.Layout = "admin/layout.html" this.TplName = "admin/list.html" 在layout.ht ...
- 算法_hdoj_1005
Question: Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6 ...
- Iris请求方式和数据返回类型
1. Iris起服务 package main import "github.com/kataras/iris" func main() { //1.创建app结构体对象 app ...