c语言桶排序,排序算法之——桶排序
这是本人的第一篇随笔,为的是分享学习经验,和大家讨论一些算法,以便取得些许进步,也是对学习的总结。
话不多说,下面我会用图文的方式向各位介绍桶排序。
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语言桶排序,排序算法之——桶排序相关推荐
- 输入十个数进行排序_十大经典排序算法(Javascript描述)
"本文13906字,阅读大约需要35分钟." 这世界上总存在着那么一些看似相似但有完全不同的东西,比如雷锋和雷峰塔,小平和小平头,玛丽和马里奥,Java和Javascript... ...
- sqlserver 根据数组排序_看动画学算法之:排序-count排序
简介 今天我们介绍一种不需要作比较就能排序的算法:count排序. count排序是一种空间换时间的算法,我们借助一个外部的count数组来统计各个元素出现的次数,从而最终完成排序. count排序的 ...
- 算法与数据结构 - 排序详解
目录 前言 引言 业务场景 代码模拟 1. 冒泡排序 1.1 什么是冒泡排序 1.2 图解冒泡 1.3 代码编写 1.4 总结分析 时间复杂度 是否为原地排序 2. 选择排序 2.1 什么是选择排序 ...
- 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?
什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...
- 微服务限流及熔断一:四种限流算法(计数器算法、滑动窗口算法、令牌限流算法、漏桶限流算法)
引言 本篇内容根据<spring cloud alibaba 微服务原理与实战>中内容摘取,希望和大家分享限流的思想,本篇不涉及代码层面的实现. 限流的目的 目的:通过限制并发访问数或者限 ...
- 函数c语言桶排算法,C语言基本排序算法之桶式排序实例
本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...
- C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)
排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序: 直接插入排序 希尔排序 (插入) 冒泡排序 快速排序 (交换) 直接选择排序 ...
- C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)
参考:C语言五大排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)动态演示 作者:一只青木呀 发布时间: 2020-09-09 20:18:43 网址:https://blog.csdn.net/ ...
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
最新文章
- python中的join函数连接dataframe_python pandas DataFrame.join用法及代码示例
- tensorflow就该这么学--5( 神经网络基础)
- linux配置apache tomcat,linux下apache+tomcat的配置实现
- android 字定义GridView 引用自己的定义布局
- SAP Cloud for Customer ABSL的一些优化
- jenkins插件调用job_【Jenkins插件_实践】1.Job Import Plugin迁移Jobs
- 数据库原理—关系模型的数据操作(八)
- win10安装应用商店版word(ump版word)
- Android 自定义progressDialog实现
- Python中的枚举enumerate
- 心电图 python_能测血压,还有心电图,兼顾9大运动模式,dido手环还不错
- w10打开网络计算机退出,Win10网络发现已关闭怎么办?|Win10启用网络发现方法
- 【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类
- ElasticSearch创建索引映射文档+IK分词器
- 0.96英寸128*64 OLED显示二维码
- VC++ 动态检测串口的热插拔(一)通过遍历实现
- 智力开发(赛马问题)
- github上下载nacos教程并安装
- 中国首枚NFC邮票发行背后,NFC技术的“有限性”创新
- 【Unity3D】AudioSource组件