桶排序

概要

本章介绍排序算法中的桶排序。内容包括:
1. 桶排序介绍
2. 桶排序图文说明
3. 桶排序实现
3.1  桶排序C实现
3.2  桶排序C++实现
3.3  桶排序Java实现

转载请注明出处:http://www.cnblogs.com/skywang12345/p/3602737.html


更多排序和算法请参考:数据结构与算法系列 目录

桶排序介绍

桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。

假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。
在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。

桶排序图文说明

桶排序代码

/** 桶排序** 参数说明:*     a -- 待排序数组*     n -- 数组a的长度*     max -- 数组a中最大值的范围*/
void bucketSort(int a[], int n, int max) { int i,j; int buckets[max]; // 将buckets中的所有数据都初始化为0。 memset(buckets, 0, max*sizeof(int)); // 1. 计数 for(i = 0; i < n; i++) buckets[a[i]]++; // 2. 排序 for (i = 0, j = 0; i < max; i++) { while( (buckets[i]--) >0 ) a[j++] = i; } }

bucketSort(a, n, max)是作用是对数组a进行桶排序,n是数组a的长度,max是数组中最大元素所属的范围[0,max)。

假设a={8,2,3,4,3,6,6,3,9}, max=10。此时,将数组a的所有数据都放到需要为0-9的桶中。如下图:

在将数据放到桶中之后,再通过一定的算法,将桶中的数据提出出来并转换成有序数组。就得到我们想要的结果了。

桶排序实现

桶排序C实现
实现代码(bucket_sort.c)

 1 /**
 2  * 桶排序:C 语言
 3  *  4  * @author skywang  5  * @date 2014/03/13  6 */  7  8 #include <stdio.h>  9 #include <stdlib.h> 10 #include <string.h> 11 12 // 数组长度 13 #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) ) 14 15 /* 16  * 桶排序 17  * 18  * 参数说明: 19  * a -- 待排序数组 20  * n -- 数组a的长度 21  * max -- 数组a中最大值的范围 22 */ 23 void bucket_sort(int a[], int n, int max) 24 { 25 int i, j; 26 int *buckets; 27 28 if (a==NULL || n<1 || max<1) 29 return ; 30 31 // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。 32 if ((buckets=(int *)malloc(max*sizeof(int)))==NULL) 33 return ; 34 memset(buckets, 0, max*sizeof(int)); 35 36 // 1. 计数 37 for(i = 0; i < n; i++) 38 buckets[a[i]]++; 39 40 // 2. 排序 41 for (i = 0, j = 0; i < max; i++) 42 while( (buckets[i]--) >0 ) 43 a[j++] = i; 44 45  free(buckets); 46 } 47 48 void main() 49 { 50 int i; 51 int a[] = {8,2,3,4,3,6,6,3,9}; 52 int ilen = LENGTH(a); 53 54 printf("before sort:"); 55 for (i=0; i<ilen; i++) 56 printf("%d ", a[i]); 57 printf("\n"); 58 59 bucket_sort(a, ilen, 10); // 桶排序 60 61 printf("after sort:"); 62 for (i=0; i<ilen; i++) 63 printf("%d ", a[i]); 64 printf("\n"); 65 }

桶排序C++实现
实现代码(BucketSort.cpp)

 1 /**
 2  * 桶排序:C++
 3  *  4  * @author skywang  5  * @date 2014/03/13  6 */  7  8 #include <iostream>  9 #include <cstring> 10 using namespace std; 11 12 /* 13  * 桶排序 14  * 15  * 参数说明: 16  * a -- 待排序数组 17  * n -- 数组a的长度 18  * max -- 数组a中最大值的范围 19 */ 20 void bucketSort(int* a, int n, int max) 21 { 22 int i, j; 23 int *buckets; 24 25 if (a==NULL || n<1 || max<1) 26 return ; 27 28 // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。 29 if ((buckets = new int[max])==NULL) 30 return ; 31 memset(buckets, 0, max*sizeof(int)); 32 33 // 1. 计数 34 for(i = 0; i < n; i++) 35 buckets[a[i]]++; 36 37 // 2. 排序 38 for (i = 0, j = 0; i < max; i++) 39 while( (buckets[i]--) >0 ) 40 a[j++] = i; 41 42  delete[] buckets; 43 } 44 45 46 int main() 47 { 48 int i; 49 int a[] = {8,2,3,4,3,6,6,3,9}; 50 int ilen = (sizeof(a)) / (sizeof(a[0])); 51 52 cout << "before sort:"; 53 for (i=0; i<ilen; i++) 54 cout << a[i] << " "; 55 cout << endl; 56 57 bucketSort(a, ilen, 10); // 桶排序 58 59 cout << "after sort:"; 60 for (i=0; i<ilen; i++) 61 cout << a[i] << " "; 62 cout << endl; 63 64 return 0; 65 }

桶排序Java实现
实现代码(BucketSort.java)

 1 /**
 2  * 桶排序:Java
 3  *  4  * @author skywang  5  * @date 2014/03/13  6 */  7  8 public class BucketSort {  9 10 /* 11  * 桶排序 12  * 13  * 参数说明: 14  * a -- 待排序数组 15  * max -- 数组a中最大值的范围 16 */ 17 public static void bucketSort(int[] a, int max) { 18 int[] buckets; 19 20 if (a==null || max<1) 21 return ; 22 23 // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。 24 buckets = new int[max]; 25 26 // 1. 计数 27 for(int i = 0; i < a.length; i++) 28 buckets[a[i]]++; 29 30 // 2. 排序 31 for (int i = 0, j = 0; i < max; i++) { 32 while( (buckets[i]--) >0 ) { 33 a[j++] = i; 34  } 35  } 36 37 buckets = null; 38  } 39 40 public static void main(String[] args) { 41 int i; 42 int a[] = {8,2,3,4,3,6,6,3,9}; 43 44 System.out.printf("before sort:"); 45 for (i=0; i<a.length; i++) 46 System.out.printf("%d ", a[i]); 47 System.out.printf("\n"); 48 49 bucketSort(a, 10); // 桶排序 50 51 System.out.printf("after sort:"); 52 for (i=0; i<a.length; i++) 53 System.out.printf("%d ", a[i]); 54 System.out.printf("\n"); 55  } 56 }

上面3种实现的原理和输出结果都是一样的。下面是它们的输出结果:

before sort:8 2 3 4 3 6 6 3 9
after  sort:2 3 3 3 4 6 6 8 9 

转载于:https://www.cnblogs.com/alantu2018/p/8465526.html

常用排序算法(八)桶排序相关推荐

  1. 排序算法:桶排序、计数排序、基数排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 这篇博客将主要介绍三种时间复杂度是 ...

  2. 排序算法之--桶排序(桶,像桶一样的排序,听起来很有趣哦0。0)

    排序算法之--桶排序 桶排序的工作的原理是将数组分到有限数量的桶子里,而这个有限数量是指多少个呢? 不急,容我细细道来:我们可以先求出这个数组的最大值和最小值,那么桶的数量就是max-min+1咯 为 ...

  3. c语言桶排序,排序算法之——桶排序

    这是本人的第一篇随笔,为的是分享学习经验,和大家讨论一些算法,以便取得些许进步,也是对学习的总结. 话不多说,下面我会用图文的方式向各位介绍桶排序. 1.主要思想: 桶排序的大体思路就是先将数组分到有 ...

  4. 排序算法_桶排序(箱排序)

    一.算法描述 假设有一组长度为N的待排关键字序列K[1....n]. 首先将这个序列划分成M个的子区间(桶). 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) , ...

  5. 排序算法(7)----桶排序

    桶排序:  * 计数排序适合小范围的大量重复元素,而桶排序适合区间内尽可能随机的元素  * 它的思想是: * 把数据存在的区间划分为小的区间,就像桶一样,这些在一个桶中的数据在桶内排好序,再合并成排序 ...

  6. 经典白话算法之桶排序

    最快最简单的排序--桶排序 在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序--总之很多东西都 ...

  7. java 桶排序_[图解] 桶排序

    桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...

  8. 【每日算法】桶排序算法

    1)算法简介 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序 ...

  9. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

最新文章

  1. FPGA设计心得(11)关于FIFO IP核使用的一点注意事项
  2. Java程序设计学习笔记(一)
  3. element显示服务器的图片,Vue+ElementUI+SpringMVC实现图片上传和回显
  4. 东方明珠胡俊:「东方明珠数据中台」四年发展历史全解(内附彩蛋)
  5. 控制面板的cpl程序列表
  6. python实例[判断操作系统类型]
  7. php练习 租房子
  8. BZOJ1500 [NOI2005]维修数列(Splay tree)
  9. 关于在 matlab 中使用 ode45 算出拉格朗日方程中的关节加速度
  10. python能做什么-Python究竟是什么?能干嘛?
  11. 深入理解Flink ---- 系统内部消息传递的exactly once语义
  12. P2325 [SCOI2005]王室联邦
  13. 如何在matlab中建立水箱模型_水箱
  14. 【ES】Elasticsearch的特点优点 为什么比MySQL快?
  15. Motorola S19(S-record)格式解析
  16. js 时间戳与日期时间的相互转换
  17. python嗅探工具详解附源码(使用socket,带tkinter界面)
  18. 使用vue+vant搭建商城
  19. 【CSS技巧】文字分散对齐的方法
  20. 设计模式之依赖倒置设计原则

热门文章

  1. java初始块,java初始代码块
  2. 站长吧asp工具设置_网站更换域名需要怎么办?网站更换域名如何设置?
  3. Android的ListView长按监听器
  4. Part Six 地理定位API
  5. 基金指数温度怎么算_壁挂炉采暖费怎么算?从两千到八百,内行人教你别再花冤枉钱...
  6. 20190804:有效的括号(误删补发)
  7. pcc定义_PCC介绍——智能管道
  8. oracle 完整约束,【oracle】完整性約束
  9. 流程建设过程中个人和团队可能面临的问题
  10. 失去健康代表失去一切