【算法导论】桶排序

桶排序

时间复杂度为:O(n)

基本思想:将要排列的序列分成n组,每组分别进行排序,然后在合并到一起,这里面有分而治之的思想。实例说明:大家学c语言肯定学过switch-case结构,最常见的题型就是对成绩进行分类,但是这里我们是对其进行排名。假设有十个学生的成绩如下:78,17,39,26,72,94,21,12,23,68。我们可以把成绩先进行分段(称为桶),每十分分为一段,共分为10段。然后在每段内进行排序,每一段的排序可以采用插入排序,最后再进行合并即可。各段的内容为:

 桶编号:桶中元素

           0: 

           1:12 、17

           2:21 、23 、26

           3:39

           4:

           5:

           6:68

           7:72 、 78

           8:

           9:94

具体的程序实现如下:

#include<stdio.h>
#include<malloc.h>  

void inc_sort(int arrayA[],int size,int bucket_size);

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

void main()
{
    int raw[]={78,17,39,26,72,94,21,12,23,68};
    int size=sizeof(raw)/sizeof(int);
    inc_sort(raw,size,10);
}

/****************************************************\
函数功能:对输入数组进行桶排序
输入:数组及其大小、桶的大小
输出:无
\****************************************************/
void inc_sort(int arrayA[],int size,int bucket_size)
{
    KeyNode **bucket=(KeyNode **)malloc(bucket_size*sizeof(KeyNode *)); //指向指针的指针,bucket相当于二维数组
    for(int i=0;i<bucket_size;i++)
	{
        bucket[i]=(KeyNode *)malloc(sizeof(KeyNode));//动态开辟空间
        bucket[i]->key=0; //初始化桶中的数据
        bucket[i]->next=NULL;
    }  

    for(int j=0;j<size;j++)
	{
        KeyNode *node=(KeyNode *)malloc(sizeof(KeyNode));//创立节点
        node->key=arrayA[j];
        node->next=NULL;  

        int index=arrayA[j]/10; //映射函数计算桶号和散列函数相似    

        KeyNode *p=bucket[index];//初始化p成为桶中数据链表的头指针  

        if(p->key==0)//当桶中还没有数据
            bucket[index]->next=node;
   		else
		{
            //链表结构的插入排序
            while((p->next!=NULL)&&(p->next->key<=node->key))//插入的数据大于当前数据时,从头结点开始
                p=p->next;                                   //直到找到大于它的节点为止
            node->next=p->next;
            p->next=node;
        }
		(bucket[index]->key)++;
    }  

    for(int i=0;i<bucket_size;i++)
	{
        for(KeyNode *k=bucket[i]->next; k!=NULL; k=k->next)
			printf("%d ",k->key);
	//	printf("\n");
	}
    printf("\n"); 

	free(bucket);//记得释放申请的内存空间

}  

注意:我是在vs2008上运行的,与vc 6.0有点区别,主要是循环体中的循环变量的作用域,出错体现在循环变量的重复定义上。例如:在vs2008或vs2010上,程序为:

#include<stdio.h>
void main()
{
int i=0;
for(int i=0;i<5;i++)
printf("%d ",i);
}

则在VC 6.0上需改为:

#include<stdio.h>
void main()
{
int i=0;
for(i=0;i<5;i++)
printf("%d ",i);
} 

原文:http://blog.csdn.net/tengweitw/article/details/9713333

作者:nineheadedbird

时间: 2024-10-27 23:13:43

【算法导论】桶排序的相关文章

经典白话算法之桶排序

最快最简单的排序--桶排序 在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序--总之很多东西都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎考的真是惨不忍睹(满分是10分).接下来将分数进

【算法导论】排序算法总结

排序算法总结         从六月初开始看算法导论,陆陆续续看了有2个月了,但实际看的时间只有半个月左右.这期间都忙着找导师.期末考试,同时还回家修养了十来天.真正专心的看算法是在离家返校后,由于没有考试和作业的烦恼,天天都沉浸在算法中,感觉效率较高.这段时间学到的东西较多,下面来总结一下:         学到的排序算法可以分为两类:比较排序.非比较排序.(这些排序算法的详细介绍及c程序实现在本文末都给出了链接,欢迎参考与指正!)         比较排序有:插入排序法.合并排序法.堆排序法

【算法导论】排序 (二):堆排序

四.(1)堆排序 第一次听堆排序是在107lab听忠哥讲的,但是没讲怎么实现.那时刚看了数据结 构的二叉树,还以为要通过指针建立二叉树的方式来实现,觉得挺难的. 其实堆排序实现没有想象中 的那么难. "堆"这个词最初是在堆排序中提出来的,但后来就逐渐指"废料收集储存区",就像程 序设计语言Lisp和Java中所提供的设施那样.我们这里的堆数据结构不是废料收集存储区. 堆排序的 运行时间与归并排序一样为O(n lg n),  但是一种原地(in place)排序. (

【算法导论】排序(一)

虽然久闻大名,但第一次接触算法导论,是看了网易公开课MIT的<算法导论>课,记得 第一集就讲到了 插入排序和归并排序. 几个星期前也买了算法导论这本书,准备慢慢啃~ 这星期主要在看前两 部分,除了对于讲渐进时间.递归式分析这些东西感到云里雾里的,其它的都就 感觉越看越有觉得入 迷,果然不愧是一本经典之作 好吧,开始.本文主要是用C++把书中的算法实现,以及一些笔记. 一.插入排序. 插入算法的设计使用的是增量(incremental)方法:在排好子数组A[1..j- 1]后,将 元素A[ j]

排序算法之桶排序

桶排序      桶排序的基本思想就是待排序的数据分别放入不同的桶中,这些桶之间其实是有序的.然后在这些桶中将分在里面的数据进行排序.最终就完成了整个序列的排序.      假设将一个均匀分布在区间[0,200)的一些待排序的序列,分成20个桶中.每个桶的大小都是10.分别存数据[0, 9), [10, 19), [20, 29) -. [190, 199),将待排序数组中的数据分别存进这些桶中,然后分别对桶中的元素进行排序,这样就完成了排序.      比如有数据{32, 43, 1, 65,

【算法导论】排序 (四):决策树、线性时间排序(计数、基数、桶排序)

到目前为止,一共整理总结了五大排序算法: 1.插入排序 2.冒泡排序.选择排序.交换排序 (把这三种方法归为一种,因为他们的思想本质上都是一样的) 3.归并排序 4.堆排序 5.快速排序 以上五种排序都可以称为"比较排序",顾名思义,因为他们都是基于比较元素 来决定其相对位置的. 其中前两种的时间为O(n^2),归并排序和堆排序最坏O( n lg n ),快排平 均O( n lg n ) 定理:任意一种比较排序算法最坏情况下,都需要做 Ω( n lg n )次的比较. 我们通过决策树来

【算法导论】排序 (三):快速排序 深入分析

五.快速排序 快速排序是最常用的一种排序算法,包括C的qsort,C++和Java的sort,都采用了快 排(C++和Java的sort经过了优化,还混合了其他排序算法). 快排最坏情况O( n^2 ),但平均效率 O(n lg n),而且这个O(n lg n)几号中隐含的常数因子很小,快排可以说是最快的排序算法,并非浪得虚名 .另外它还是就地排序. 快速排序是基于分治模式的: 分解:数组A[p..r]被划分成两个(可能空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的

最快最简单的排序——桶排序

原文:最快最简单的排序--桶排序 最快最简单的排序--桶排序   在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序--总之很多东西都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法.     首先出场的我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎考

桶排序算法

桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序的一种归纳结果.当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n)).但桶排序并不是比较排序,他不受到 O(n log n) 下限的影响. 本文地址:http://www.cnblogs.com/archimedes/p/bucket-sort-algorithm.html