大数据情况下桶排序算法的运用与C++代码实现示例_C 语言

箱排序的变种。为了区别于上述的箱排序,姑且称它为桶排序(实际上箱排序和桶排序是同义词)。
桶排序的思想是把[0,1)划分为n个大小相同的子区间,每一子区间是一个桶。然后将n个记录分配到各个桶中。因为关键字序列是均匀分布在[0,1)上的,所以一般不会有很多个记录落入同一个桶中。由于同一桶中的记录其关键字不尽相同,所以必须采用关键字比较的排序方法(通常用插入排序)对各个桶进行排序,然后依次将各非空桶中的记录连接(收集)起来即可。
注意:
这种排序思想基于以下假设:假设输入的n个关键字序列是随机分布在区间[0,1)之上。若关键字序列的取值范围不是该区间,只要其取值均非负,我们总能将所有关键字除以某一合适的数,将关键字映射到该区间上。但要保证映射后的关键字是均匀分布在[0,1)上的。
桶排序的平均时间复杂度是线性的,即O(n)。
箱排序只适用于关键字取值范围较小的情况,否则所需箱子的数目m太多导致浪费存储空间和计算时间。
例如n=10,被排序的记录关键字ki取值范围是0到99之间的整数(36,5,16,98,95,47, 32,36,48)时,要用100个箱子来做一趟箱排序。(即若m=n2时,箱排序的时间O(m+n)=O(n2))。

例子
一年的全国高考考生人数为500 万,分数使用标准分,最低100 ,最高900 ,没有小数,你把这500 万元素的数组排个序。
分析:对500W数据排序,如果基于比较的先进排序,平均比较次数为O(5000000*log5000000)≈1.112亿。但是我们发现,这些数据都有特殊的条件:  100=<score<=900。那么我们就可以考虑桶排序这样一个“投机取巧”的办法、让其在毫秒级别就完成500万排序。
方法:创建801(900-100)个桶。将每个考生的分数丢进f(score)=score-100的桶中。这个过程从头到尾遍历一遍数据只需要500W次。然后根据桶号大小依次将桶中数值输出,即可以得到一个有序的序列。而且可以很容易的得到100分有***人,501分有***人。
实际上,桶排序对数据的条件有特殊要求,如果上面的分数不是从100-900,而是从0-2亿,那么分配2亿个桶显然是不可能的。所以桶排序有其局限性,适合元素值集合并不大的情况。
代码:

#include<iostream.h>
#include<malloc.h> 

typedef struct node{
 int key;
 struct node * next;
}KeyNode; 

void inc_sort(int keys[],int size,int bucket_size){
 KeyNode **bucket_table=(KeyNode **)malloc(bucket_size*sizeof(KeyNode *));
 for(int i=0;i<bucket_size;i++){
  bucket_table[i]=(KeyNode *)malloc(sizeof(KeyNode));
  bucket_table[i]->key=0; //记录当前桶中的数据量
  bucket_table[i]->next=NULL;
 }
 for(int j=0;j<size;j++){
  KeyNode *node=(KeyNode *)malloc(sizeof(KeyNode));
  node->key=keys[j];
  node->next=NULL;
  //映射函数计算桶号
  int index=keys[j]/10;
  //初始化P成为桶中数据链表的头指针
  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)++;
  }
 }
 //打印结果
 for(int b=0;b<bucket_size;b++)
  for(KeyNode *k=bucket_table[b]->next; k!=NULL; k=k->next)
   cout<<k->key<<" ";
 cout<<endl;
} 

void main(){
 int raw[]={49,38,65,97,76,13,27,49};
 int size=sizeof(raw)/sizeof(int);
 inc_sort(raw,size,10);
}

 
上面源代码的桶内数据排序,我们使用了基于单链表的直接插入排序算法。可以使用基于双向链表的快排算法提高效率。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 排序算法
桶排序
冒泡排序示例、快速排序示例、作文素材运用示例、paxos算法应用示例、直接选择排序示例,以便于您获取更多的相关知识。

时间: 2024-10-06 11:23:25

大数据情况下桶排序算法的运用与C++代码实现示例_C 语言的相关文章

如何构建大数据情况下使用的杀手级应用

在大数据的发展热潮中,我们一直没有给予应用足够的关注.虽然大数据可以提供惊人的商业见解,但除非这些商业见解呈现在一个能够激发新的商业行为的应用程序中,否则是毫无价值的. 虚拟机在http://www.aliyun.com/zixun/aggregation/14385.html">云应用平台领域充当思想领袖已经有段时间了,现在,我妈应该把注意力转向大数据和云计算的交汇领域. 如何开发一个可以轻松地在私有云和公共云中移动,且可以在防火墙两侧接收数据的应用呢?那么,如何构建大数据的杀手级云应用

详解Bucket Sort桶排序算法及C++代码实现示例_C 语言

桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序的一种归纳结果.当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n)).但桶排序并不是比较排序,他不受到O(n log n)下限的影响. 桶排序以下列程序进行: 1.设置一个定量的数组当作空桶子. 2.寻访序列,并且把项目一个一个放到对应的桶子去. 3.对每个不是空的桶子进行排

简单掌握桶排序算法及C++版的代码实现_C 语言

桶排序介绍桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里. 假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX).在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0:将容量为MAX的桶数组中的每一个单元都看作一个"桶". 在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标.当a中数据被读取时,就将桶的值加1.例如,读取到数组a[3]=5,则将r[5]的值+1. C++实现算法假设数据分

对于大数据大流量情况下微软架构的水平扩展的遐想(瞎想)

最近回顾SAAS的书籍,书中的扩展架构都有点让我痴迷,但书中介绍的都是以Java,Apache,JBoss,Hadloop等技术实现负载均衡,大数据处理,对于微软架构并未提及,所以让我陷入无限遐想,夜不能眠啊.今天的文章纯属瞎想,有错的不要批评,大家一起讨论就可以了. 对于大数据处理来说,要解决的问题: 1.web服务器的负载均衡 2.web服务器的水平扩展 3.数据库的分库处理 4.数据库读写分离 5.数据库的水平扩展 大概的架构: (没什么工具,用word画的,丑了点,哈) 在大数据,大流量

深入解析桶排序算法及Node.js上JavaScript的代码实现_node.js

1. 桶排序介绍桶排序(Bucket sort)是一种基于计数的排序算法,工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).当要被排序的数据内的数值是均匀分配的时候,桶排序时间复杂度为Θ(n).桶排序不同于快速排序,并不是比较排序,不受到时间复杂度 O(nlogn) 下限的影响. 桶排序按下面4步进行: (1)设置固定数量的空桶. (2)把数据放到对应的桶中. (3)对每个不为空的桶中数据进行排序. (4)拼接从不为空的

大数据量下的分页

分页|数据 对于非常大的数据模型而言,分页检索时,每次都加载整个数据源非常浪费.通常的选择是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行. 本文演示ASP.net的DataGrid和Sql Server 实现大数据量下的分页,为了便于实现演示,数据表采用了Northwind数据库的Orders表(830条记录). 如果数据表中有唯一的自增索引,并且这个字段没有出现断号现象.检索页面大小的块区数据就非常简单了.通过简单的Sql语句就可以实现这个功能:select * from

大数据背景下知识产权侵权行为网络异化与解决思路 —— 以著作权间接侵权为视角

一.大数据对知识产权的影响 (一)大数据对于知识产权的促进作用 互联网的发展壮大为智力成果的传播提供了一个全新的方式,即网络传播方式.相对于传统传播方式,网络传播方式几乎为零成本,因此,网络技术的出现,不但改变了人类的生活方式和社会经济发展模式,而且对当代各国的法律制度提出了挑战.正是在这个意义上,人们赋予知识产权制度以鲜明的时代技术特征,将其称为"网络知识产权".[1]所以,知识产权客体的无形性与网络空间的虚拟性具有一种天然的契合性,这种天然的契合性对于知识产权的发展有极大的促进作用

自动洞察:大数据的下一个重大转折

为了跟随大数据的发展以及提高我们对信息的使用,我们需要具有洞察力的应用,可以在连接洞察与操作的时候快速且低廉地提取相关性. 我坚持认为具有洞察力的应用是帮助企业高效探究大数据的关键,可以提高决策效率和解决重大问题.为了更好的理解和重视我们开发该应用的重要性,有两件事是很重要的,一是了解大数据大体上发生了什么,二是评估我们使用商业智能系统的经验如何促进我们思考这个应用. 因为我认为具有洞察力的应用是大数据的下一个变化(可以看看最近IBM沃森平台使用的一些应用),我会发表系列博客进一步探究这个问题.

大数据时代下的意图搜索 个性化服务是关键

意图搜索起源于互联网搜索引擎,是基于互联网上海量的无组织.异构.动态的数据与信息环境下搜索引擎不能准确理解用户的搜索意图而提出的,利用如神经网络算法等机器学习方法实现智能化的自动搜索,从而更加精准.主体的提供个性化的服务. 大数据时代下的意图搜索个性化服务是关键 一.目的意义 大数据时代,任何网络行为所留下的"蛛丝马迹"都以数据的形式隐藏在大数据中,正所谓"存在就有痕迹,联系就有信息",通过应用物联网.大数据.人工智能等技术,构建网络空间中行为事件.思想事件等模型.