码迷,mamicode.com
首页 > 编程语言 > 详细

桶排序及C语言实现

时间:2014-11-30 11:28:26      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:c语言   算法导论   算法   桶排序   

本文内容主要参考这篇博文:http://hxraid.iteye.com/blog/647759


桶排序算法的基本原理是:把数组中的所有元素分为若干个数据块,也就是若干个桶,然后对每个桶里的数据进行排序,最后将所有桶里的数据依次排列即可。


这里就存在两个问题:

(1)怎样划分数据块,也就是分几个桶,每个桶放哪几个数据。

(2)对每个数据块里的数据怎样排序。


对于第一个问题:用函数映射的方法来划分。举一个很简单的例子,假设数据都为2位的正整数,那么对应的映射函数可以为f(x)=x/10.即把十位相同的数划到同一数据块。如下图所示。

bubuko.com,布布扣

对于第二个问题:用前面讲的排序算法对每个数据块的元素进行排序即可,比如插入排序,快速排序等。


同样,对于算法时间复杂度的分析,也是基于上面两个问题的影响。对数组进行划分数据块,时间复杂度为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 result
	KeyNode * 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);
}


桶排序及C语言实现

标签:c语言   算法导论   算法   桶排序   

原文地址:http://blog.csdn.net/bing_bing304/article/details/41620817

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!