1.原理

桶排序 (Bucket sort)或所谓的箱排序,是一种分块的排序算法,工作的原理是将数组分到有限数量的桶里,每个桶的大小都相等。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)

把待排序序列(数组)中的数据根据函数映射方法分配到若干个桶中,在分别对各个桶进行排序,最后依次按顺序取出桶中的数据。
适用于数据分配均匀,数据比较大,相对集中的情况。

简单来说就是把数据按某种方法分类,每一个类放进一个容器(箱子)中,然后用其他排序方法对每个容器中的数据排序,最后再按分配方法产生的顺序依次取出数据。

2.函数映射

假设数据都为2或3位的正整数(0~999),那么对应的映射函数可以为

f(x)=x/100        也就是把百位相同的数据都放在同一个容器中,总共有10个容器

映射函数要根据数据情况合理的适用,排序的优劣与函数映射有很大的关系,不同的映射方法就决定了不同的桶的大小以及桶的数量。

极端的方法就是,可以达到每个桶中只有一个元素,使得时间复杂度最优,空间复杂度最高。

函数映射方法的选择要根据具体的情况来选择,没有最好的方法,只有比较合适的方法。

3.排序方法

总的来说有两类实现方法,一类是在把数据从总的容器分配到每一个容器中时就按大小放进去

另一类是把数据全部放入容器中,再来排序。后一类方法可以调用新的排序方法,也可以调用桶排序,形成迭代。

4.代码

我生成了20个3位的随机数(0~999),按照百位的数字分别插入到不同的链表中。

函数映射:        f(x)=x/100

排序方法:        在从总的数组中分配到每个链表时,按大小插入有序链表

最后按照链表的下标,按顺序取就可以了。

#include <stdio.h>
#include <stdlib.h>typedef struct node {int num;  //数据域 struct node *next;    //指针域
}KeyNode;void bucket_sort(int a[],int size,int bucket_size) {int i,j;        //数组,数组长度,桶的大小//定义动态的指针数组KeyNode **bucket_num = (KeyNode **)malloc(bucket_size * sizeof(KeyNode*));for(i = 0;i < bucket_size;i++) {bucket_num[i] = (KeyNode*)malloc(sizeof(KeyNode));//为每个链表定义头结点 bucket_num[i]->num = 0;   bucket_num[i]->next = NULL;   //指针变量初始化为空}for(j = 0;j < size;j++) //准备插入{KeyNode *node = (KeyNode *)malloc(sizeof(KeyNode));//定义一个节点 node->num = a[j];    //数据域存数据 node->next = NULL; //指向空int index = a[j]/100;  //映射函数 计算桶号KeyNode *p = bucket_num[index];//p指向链表的头//链表结构的插入排序while(p->next != NULL && p->next->num <= node->num){p = p->next;   //1.链表为空,p->next==NULL,进入不了循环 }                  //2.链表不为空,因为链表从无开始按顺序插入,数据为有序的,//可以找到    前一个节点 <= node <=后一个节点//节点插入链表 node->next = p->next;p->next = node;(bucket_num[index]->num)++; //记录一下该链表中有几个有效节点 }//打印结果KeyNode * k = NULL;  //定义一个空的结构体指针用于储存输出结果for(i = 0;i < bucket_size;i++){//for(k = bucket_num[i]->next;k!=NULL;k=k->next)//通过最后一个指针指向空k = bucket_num[i]->next;for(int m=0;m<bucket_num[i]->num;m++)   //通过头指针记录节点数{printf("%d ",k->num);k=k->next;}      printf("\n");
}int main()
{int a[20];for(int i=0;i<20;i++){a[i]=rand()%1000;   //给数组赋随机数 printf("%d ",a[i]);}puts("");puts("");//int a[]={491,381,615,917,716,13,217,419,19,138,61,917,176,113,27,419,419,38,615,917,16,113,217,419};int size = sizeof(a)/sizeof(int);    //计算数组长度bucket_sort(a,size,10);//数组名,数组长度,桶的个数 }

十大排序算法-桶排序(c语言实现)相关推荐

  1. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  2. 十大经典排序算法—桶排序

    1.算法思想: 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量 使用的映 ...

  3. 排序算法----桶排序(java版)

    桶排序 桶排序(Bucket Sort)顾名思义,会用到"桶",我们可以将其想象成一个容器,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序.桶内排完序之后 ...

  4. 疯子的算法总结(六) 复杂排序算法 ② 桶排序

    从<基于比较的排序结构总结 >中我们知道:全依赖"比较"操作的排序算法时间复杂度的一个下界O(N*logN).但确实存在更快的算法.这些算法并不是不用"比较& ...

  5. 排序算法----桶排序(数组)

    桶排序是一种效率很高的排序算法,它的时间复杂度为O(N+M),(N个元素,范围为0--M),但桶排序有一定的限制,必须为非负整数,而且元素不宜过大. 算法思想: 设待排序序列的元素取值范围为0到m,则 ...

  6. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  7. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  8. JavaScript算法——桶排序

    一.桶排序的原理 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.思路大致是, 设置一个定量的数组当作空桶: 遍历输入数据,并且把数据一个一个放到对应的桶里去 ...

  9. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  10. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

最新文章

  1. SuperMap iDesktop Cross 8C 开源桌面GIS下载与扩展开发
  2. 安卓ttf格式的字体包_多看字体包优化篇
  3. Cisco路由器的Flash和NVRAM
  4. Android中的跨进程通信方法实例及特点分析(二):ContentProvider
  5. 【Tomcat】解决GET方式传递的参数(URL中的参数)乱码问题
  6. iOS开发--地图与定位
  7. hazelcast入门教程_Hazelcast入门指南第7部分
  8. 有线电视的现状与发展,全国一网与广电5G一体化建设
  9. 如何开始使用Java中的Lambda表达式
  10. html loader 路径,Webpack html-loader提取链接和脚本
  11. 微软在线实验室启用谷歌的reCAPTCHA,我们又丢失了一个好东东
  12. Win10安装Ubuntu16.04 双系统
  13. shell逻辑判断、文件属性判断、if特殊用法、case判断
  14. 帆软报表开发之基础操作
  15. 内连接、外连接和全连接的区别
  16. php调用纯真ip,php调用纯真IP数据库进行IP定位
  17. MRP存在的七大缺陷,你造吗?
  18. 解决PyCharm出现“更新 TKK 失败,请检查网络连接”的问题
  19. MATLAB工具箱概述
  20. 光纤跳线接口_2分钟让你搞懂跳线架和配线架的区别

热门文章

  1. 一个有情怀的PPT模板下载网站
  2. vmware tools的下载
  3. Android包管理机制(二)PackageInstaller安装APK
  4. MinGW在线安装包下载失败的解决办法
  5. vue中使用ue编辑器的一些简易说明
  6. Nike Zoom KD 5 “OKC / Away” colorway
  7. 大华事件检测智能服务器,大华股份发布全新智能视频监控服务器,提供高达768Mbps的存储带宽...
  8. Nmap小技巧——探测大网络空间、局域网中的存活主机
  9. js根据身份证获取性别、年龄、出生日期及根据出生日期获取年龄
  10. SSM框架实战详细教程(六)Spring MVC贯穿项目实战