1.概述

桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响,速度是比较快的。

步骤:

  1. 设置一个定量的阵列当作空桶子。
  2. 寻访序列,并且把项目一个一个放到对应的桶子去。
  3. 对每个不是空的桶子进行排序。
  4. 从不是空的桶子里把项目再放回原来的序列中。

理解:

例如待排数字   [6 2 4 1 5 9],准备10个空桶,最大数个空桶

[6 2 4 1 5 9]           待排数组

[0 0 0 0 0 0 0 0 0 0]   空桶

[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

1. 顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶,这个过程类似这样:空桶[ 待排数组[ 0 ] ] = 待排数组[ 0 ]

[6 2 4 1 5 9]           待排数组
[0 0 0 0 0 0 6 0 0 0]   空桶
[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

2. 顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶

[6 2 4 1 5 9]           待排数组
[0 0 2 0 0 0 6 0 0 0]   空桶
[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

3.  剩余元素过程一样,全部入桶后变成下边这样

[6 2 4 1 5 9]           待排数组
[0 1 2 0 4 5 6 0 0 9]   空桶
[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

4. 0表示空桶,跳过,顺序取出即可:1 2 4 5 6 9

2.示例

        //C# Code//桶排序public static void BucketSort(int[] nums){int maxVal = nums[0];for (int maxIndex = 1; maxIndex < nums.Length; maxIndex++){if (nums[maxIndex] > maxVal)maxVal = nums[maxIndex];}int tmpArrLen = maxVal + 1;int[] tmpArr = new int[tmpArrLen];int i, j;for (i = 0; i < nums.Length; i++)tmpArr[nums[i]]++;for (i = 0, j = 0; i < tmpArrLen; i++){while (tmpArr[i] != 0){nums[j] = i;j++;tmpArr[i]--;}}}//   int[] list = new[] { 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 };//   Sorter.BucketSort(list);

转载于:https://www.cnblogs.com/qqlin/archive/2013/03/04/2938301.html

【经典算法】第八回:桶排序相关推荐

  1. 九大经典算法之基数排序、桶排序

    08 基数排序(Radix Sort) 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.排序过程是将所有待比较数值统一为同样的数位长度,数位较短的数前 ...

  2. 经典排序算法(9)——桶排序算法详解

    桶排序(Bucket sort)或所谓的箱排序,并不是比较排序,它不受到 O(nlogn) 下限的影响. 一.算法基本思想 (1)基本思想 桶排序工作的原理是将数组分到有限数量的桶子里,每个桶子再个别 ...

  3. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...

  4. 排序算法(一)--桶排序、冒泡、快排(JAVA)

    排序算法汇总 参考书籍–<啊哈!算法> 作者:啊哈磊 首先提出一个问题:班内有5名同学,成绩分别为5,8,2,4,2分(满分10分),需要将成绩从小到大排序 简化版 桶排序 时间复杂度O( ...

  5. 算法入门篇四 桶排序

    桶排序 计数排序(基于统计) 要求数据是有限的,和数据状况有关,比如对于200个人统计他们的年龄分布,这个时候需要申请200个桶,因此对于输入数据的规模有限制,如果输入规模是不定的,空间申请就会很麻烦 ...

  6. raptor五个数排序流程图_经典算法系列之:选择排序

    1.前言 算法,在计算机中的地位,就相当于人类大脑的决策中枢系统,哪怕最简单的算法,其精妙的思维方式,都可以让人开启一扇新的视窗. 算法,它不仅仅只是狭义的用来解决计算机科学领域的问题,更是一种&qu ...

  7. 算法笔记--八个常见排序算法总结

    一. 分类描述 1. 插入排序 直接插入排序:算法简单,稳定,适用于数据量小的情况 希尔排序:直接插入排序的改进版,不稳定,对于待排序序列的不同情况效率相近 2. 交换排序 冒泡排序:算法简单,稳定, ...

  8. 下划线间隔数字 排序_面试必备:经典算法动画解析之希尔排序

    哈喽,我是程序员大鹏. 前面我们介绍了冒泡排序.选择排序和插入排序,今天我们来看一下进阶的排序. 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版.它与插入排序的不同之 ...

  9. C语言经典算法100例-037-给10个数排序

    使用简单选择排序法给10个数排序,思路如下: 将最小的元素找出并放到序列的最前面,在剩下的元素中继续找出最小的元素放在第二个位置上,以此类推,每次选出一个元素,即可确定其再有序序列中的最终位置. #i ...

  10. 九大经典算法之插入排序、希尔排序

    01 插入排序(Insertion Sort) 原理:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置. void insertion_sort(int arr[] ...

最新文章

  1. JAVA语法基础之流程控制
  2. 使用阿里云CentOS安装LAMP时,安装PHP扩展需要注意的事情
  3. dev里timeedit控件如何赋值_抽奖程序里的字节跳动模式和时长控制,让抽奖更有仪式感!...
  4. PostgreSQL消息乱码的解决
  5. redis java客户端配置,Java的Redis客户端选择-jedis与Lettuce
  6. 优先级队列 c语言,使用最小堆使用优先级队列(c语言版本)
  7. C#发布程序添加其他程序文件
  8. 【程序设计】模块化程序设计
  9. luogu 1344 追查坏牛奶(最小割)
  10. IntelliJ IDEA这样配置,代码效率嗖嗖的
  11. BIO、NIO、AIO入门认识
  12. Web前端新手一定要知道的几个框架!
  13. t-SNE高维数据可视化(python)
  14. 2021年最新林学类期刊JCR影响因子及分区
  15. 关于vc6++编译DDK驱动出现的问题fatal error C1083: Cannot open include file: 'specstrings.h': No such file or dir
  16. Error:Cannot read packageName from AndroidManifest.xml
  17. [HAOI2006]聪明的猴子 题解
  18. 芯准TTE“宏时隙“调度机制 ——基本原理
  19. 什么是SpringMVC?SpringMVC之hello.jsp实现过程 问题:SpringMVC在JSP页面取不到ModelAndView中的值(已解决)
  20. 排序-希尔排序-java

热门文章

  1. vue-cli的webpack模板项目配置文件说明
  2. 微信支付v2开发(7) 告警通知
  3. SharePoint 常用操作杂谈
  4. Sql Function defference returns and returns
  5. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十八):kafka0.10.1 内置性能测试API用法示例...
  6. 【算法编程】旋转数组查找最小数字
  7. jvm 解释器和编译器
  8. Windows 10 Build 14926发布:Insider旧版本10月15日后无法启动
  9. Linux下编译安装qemu和libvirt
  10. Ext3和Ext4文件系统