桶排序及C语言实现
来源:互联网 发布:邪恶网站源码 编辑:程序博客网 时间:2024/06/05 07:03
本文内容主要参考这篇博文:http://hxraid.iteye.com/blog/647759
桶排序算法的基本原理是:把数组中的所有元素分为若干个数据块,也就是若干个桶,然后对每个桶里的数据进行排序,最后将所有桶里的数据依次排列即可。
这里就存在两个问题:
(1)怎样划分数据块,也就是分几个桶,每个桶放哪几个数据。
(2)对每个数据块里的数据怎样排序。
对于第一个问题:用函数映射的方法来划分。举一个很简单的例子,假设数据都为2位的正整数,那么对应的映射函数可以为f(x)=x/10.即把十位相同的数划到同一数据块。如下图所示。
对于第二个问题:用前面讲的排序算法对每个数据块的元素进行排序即可,比如插入排序,快速排序等。
同样,对于算法时间复杂度的分析,也是基于上面两个问题的影响。对数组进行划分数据块,时间复杂度为O(n),对每个数据块进行排序,时间复杂度取决于使用的排序算法。在极致情况下,每个桶只有一个数据,这样的时间复杂度无疑是最优的,因为每个数据块不需要进行排序。但是空间复杂度太高。
总之,桶排序的思想就是,将数组中的全部元素划分成若干个数据块,并对每个数据块分别进行排序,以此提高时间复杂度。该算法主要适合于数量比较大并且数字相对比较集中的场合。下面是代码。
#include <stdio.h>#include <stdlib.h>typedef struct node {int key;struct node *next;}KeyNode;void bucket_sort(int keys[],int size,int bucket_size) {int i,j;KeyNode **bucket_table = (KeyNode **)malloc(bucket_size * sizeof(KeyNode*));for(i = 0;i < bucket_size;i++) {bucket_table[i] = (KeyNode*)malloc(sizeof(KeyNode));bucket_table[i]->key = 0;bucket_table[i]->next = NULL;}for(j = 0;j < size;j++) {KeyNode *node = (KeyNode *)malloc(sizeof(KeyNode));node->key = keys[j];node->next = NULL;int index = keys[j]/10;KeyNode *p = bucket_table[index];if(p->key == 0) {bucket_table[index]->next = node;(bucket_table[index]->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)++;}}//print resultKeyNode * k = NULL;for(i = 0;i < bucket_size;i++)for(k = bucket_table[i]->next;k!=NULL;k=k->next)printf("%d ",k->key);printf("\n");}int main(){int raw[] = {49,38,65,97,76,13,27,49};int size = sizeof(raw)/sizeof(int);bucket_sort(raw,size,10);}
0 0
- 桶排序及C语言实现
- 归并排序及C语言实现
- 堆排序及C语言实现
- 快速排序及C语言实现
- 希尔排序及C语言实现
- 堆排序原理及c语言实现
- 单链表及快速排序c语言实现
- 希尔排序及C语言实现
- Shell排序算法及C语言实现
- 插入排序及C语言实现
- 归并排序及C语言实现
- 堆排序算法及C语言实现
- 快速排序及C语言实现
- 计数排序及C语言实现
- C语言桶排序实现
- C语言实现排序
- 常见排序算法总结及C语言实现
- 双向冒泡排序算法思想及C语言实现
- 使 VC2013 编写的程序运行在其它电脑上
- myeclipse 和 eclipse ide for javaee 下的java web项目目录结构对比
- IOS开发---OC语言-③类的设计和简单练习
- 提供给开发者 10 款最好的 Python IDE
- 帧中继的本地管理接口类型(LMI)
- 桶排序及C语言实现
- 第十四周项目——oj平台一——求矩阵对角线元素之和
- XMPP客户端库Smack 4.0.6版开发之四
- 保存应用程序的配置信息
- 阿里云RDS文档概述——数据库管理
- 黑马程序员---OC类的本质
- 小米会倒在三个专利火枪手面前吗?
- JVM内存管理-对象访问
- 第十四周项目 oj平台二——国家排序