这是本人的第一篇随笔,为的是分享学习经验,和大家讨论一些算法,以便取得些许进步,也是对学习的总结。

话不多说,下面我会用图文的方式向各位介绍桶排序。

1、主要思想:

桶排序的大体思路就是先将数组分到有限个桶中,再对每个桶中的数据进行排序,可以说是鸽巢排序的一种归纳结果(对每个桶中数据的排序可以是桶排序的递归,或其他算法,在桶中数据较少的时候用插入排序最为理想)。

2、算法效率:

对N个数据进行桶排序的时间复杂度分为两部分:

1、对每一个数据进行映射函数的计算(映射函数确定了数据将被分到哪个桶),时间复杂度为O(N)。

2、对桶内数据的排序,时间复杂度为∑ O(Ni*logNi) ,其中Ni 为第i个桶的数据量。

对于N个待排数据,M个桶,平均每个桶[N/M]个数据的桶排序平均时间复杂度为:O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM),当N=M时,即极限情况下每个桶只有一个数据时。桶排序的最好效率能够达到O(N)。

对于相同数量的数据,桶的数量越多,数据分散得越平均,桶排序的效率越高,可以说,桶排序的效率是空间的牺牲换来的。

3、算法分析:

①初始化桶:

桶排序中的桶其实是一组指向指针的指针,有点类似于哈希表中的链地址法,与之不同的是桶本身也是结构体(图1是链地址法,图2为初始化后的桶)

②将数据放入相应的桶的同时对该桶排序:

遍历数据,根据映射函数对数据进行计算,下图的映射函数为N/10(N是当前数据),确定了桶之后,将数据在桶中采用直接插入法。下图为对数组a的桶排序。

(上图中key是桶中数据个数)

以25和23为例,25/10=2,确定25的位置在第二个桶,此时桶2还没有元素,所以直接插入,23/10=2,确定在第二个桶,此时桶2的key不为0,23<25将23插入25之前,其他的类似。

③按按照桶的顺序将元素输出:

按上图中的情况,排序后的顺序就为:10 23 25 26 30 41 43

4、代码展示(C语言):

#include

#include

typedef struct node{

int key;

struct node* next;

}KeyNode;

void bucket_sort(int keys[],int size,int bucket_size);

int main()

{

int a[]={11,11,9,21,14,55,77,99,53,25};

int size=sizeof(a)/sizeof(a[0]);

bucket_sort(a,size,10);

return 0;

}

void bucket_sort(int keys[],int size,int bucket_size)

{

KeyNode **bucket_table=(KeyNode**)malloc(bucket_size*sizeof(KeyNode*));

for(int i=0;i

bucket_table[i]=(KeyNode*)malloc(sizeof(KeyNode));

bucket_table[i]->key=0;

bucket_table[i]->next=NULL;

}

for(int i=0;i

KeyNode* node=(KeyNode*)malloc(sizeof(KeyNode));

node->key=keys[i];

node->next=NULL;

int index=keys[i]/10;//给数据分类的方法(关系到排序速度,很重要)

KeyNode *p=bucket_table[index];

if(p->key==0){

p->next=node;

p->key++;

}

else{

while(p->next!=NULL&&p->next->key<=node->key){//=的时候后来的元素会排在后面

p=p->next;

}

node->next=p->next;

p->next=node;

(bucket_table[index]->key)++;

}

}

KeyNode* k=NULL;

for(int i=0;i

for(k=bucket_table[i]->next;k!=NULL;k=k->next){

printf("%d ",k->key);

}

}

}

原文出处:https://www.cnblogs.com/Unicron/p/9461075.html

c语言桶排序,排序算法之——桶排序相关推荐

  1. 输入十个数进行排序_十大经典排序算法(Javascript描述)

    "本文13906字,阅读大约需要35分钟." 这世界上总存在着那么一些看似相似但有完全不同的东西,比如雷锋和雷峰塔,小平和小平头,玛丽和马里奥,Java和Javascript... ...

  2. sqlserver 根据数组排序_看动画学算法之:排序-count排序

    简介 今天我们介绍一种不需要作比较就能排序的算法:count排序. count排序是一种空间换时间的算法,我们借助一个外部的count数组来统计各个元素出现的次数,从而最终完成排序. count排序的 ...

  3. 算法与数据结构 - 排序详解

    目录 前言 引言 业务场景 代码模拟 1. 冒泡排序 1.1 什么是冒泡排序 1.2 图解冒泡 1.3 代码编写 1.4 总结分析 时间复杂度 是否为原地排序 2. 选择排序 2.1 什么是选择排序 ...

  4. 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?

    什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...

  5. 微服务限流及熔断一:四种限流算法(计数器算法、滑动窗口算法、令牌限流算法、漏桶限流算法)

    引言 本篇内容根据<spring cloud alibaba 微服务原理与实战>中内容摘取,希望和大家分享限流的思想,本篇不涉及代码层面的实现. 限流的目的 目的:通过限制并发访问数或者限 ...

  6. 函数c语言桶排算法,C语言基本排序算法之桶式排序实例

    本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...

  7. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)

    排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序    希尔排序 (插入)  冒泡排序     快速排序  (交换) 直接选择排序  ...

  8. C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

    参考:C语言五大排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)动态演示 作者:一只青木呀 发布时间: 2020-09-09 20:18:43 网址:https://blog.csdn.net/ ...

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

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

最新文章

  1. python中的join函数连接dataframe_python pandas DataFrame.join用法及代码示例
  2. tensorflow就该这么学--5( 神经网络基础)
  3. linux配置apache tomcat,linux下apache+tomcat的配置实现
  4. android 字定义GridView 引用自己的定义布局
  5. SAP Cloud for Customer ABSL的一些优化
  6. jenkins插件调用job_【Jenkins插件_实践】1.Job Import Plugin迁移Jobs
  7. 数据库原理—关系模型的数据操作(八)
  8. win10安装应用商店版word(ump版word)
  9. Android 自定义progressDialog实现
  10. Python中的枚举enumerate
  11. 心电图 python_能测血压,还有心电图,兼顾9大运动模式,dido手环还不错
  12. w10打开网络计算机退出,Win10网络发现已关闭怎么办?|Win10启用网络发现方法
  13. 【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类
  14. ElasticSearch创建索引映射文档+IK分词器
  15. 0.96英寸128*64 OLED显示二维码
  16. VC++ 动态检测串口的热插拔(一)通过遍历实现
  17. 智力开发(赛马问题)
  18. github上下载nacos教程并安装
  19. 中国首枚NFC邮票发行背后,NFC技术的“有限性”创新
  20. 【Unity3D】AudioSource组件

热门文章

  1. 七窍通五脏:心气足则味觉灵 肺燥热则鼻孔干 身体流出 5种 液体对应五脏
  2. 火狐游览器不支持innerText问题
  3. 计算机国考整理知识点,通过计算机国考二级必须要知道的几个要点
  4. 一政网:国考应如何选择职位?
  5. php怎么与下位机通讯,上位机与下位机之间的连接通讯方式
  6. AOSP ~ 默认属性值
  7. linux的which命令
  8. 如何将MP4视频文件转换成MP3音频格式
  9. 女生勿扰,只适合男孩子的python爬虫,男生记得偷偷爬哦!
  10. 【手势姿态估计】综述