桶排序

桶排序桶排序    桶排序的思想就是把区间[0,1)划分为n个相同大小的子区间,或称桶。然后,将n个输入输出分布到各个桶中去。因为输入树均匀且独立分布且在[0,1)上,所以一般不会有很多数落在一个桶里的情况。为得到结果,先对各个桶里的数进行排序,然后依次把各个桶中的元素列出来即可。本版本的桶排序是利用双链表实现。首先结构体定义如下:structBarrel_Node{

桶排序

        桶排序的思想就是把区间[0,1)划分为n个相同大小的子区间,或称桶。然后,将n个输入输出分布到各个桶中去。因为输入树均匀且独立分布且在[0,1)上,所以一般不会有很多数落在一个桶里的情况。为得到结果,先对各个桶里的数进行排序,然后依次把各个桶中的元素列出来即可。

本版本的桶排序是利用双链表实现。首先结构体定义如下:

struct Barrel_Node
{
	float key;
	int   num;//记录在原始s数组里的下标
	struct Barrel_Node *next;
	struct Barrel_Node *pre;
};

通过动态内存分配,定义了以下几个数组。注意Barrels定义到SIZE+1大小的桶,最大下标为SIZE,因为当s[i]=1.00时,k=s[i]*SIZE=SIZE,所以定义到SIZE+1是必要的。

static int Barrels_count[SIZE+1];//每个数组的元素记录了对应Barrels里已经放入的数的个数
struct Barrel_Node *Barrels = (struct Barrel_Node*)malloc(sizeof(struct Barrel_Node)*(SIZE+1)); //桶
struct Barrel_Node *Barrels_tmp = (struct Barrel_Node*)malloc(sizeof(struct Barrel_Node)*(SIZE+1)); //用来存放第2,第3,....个结点,然后放到对应的桶
int Barrels_tmp_count = 0;//指向当前可用的Barrels_tmp结点

基本的思想是:

for i ← 0 to SIZE
      k  =  s[i]*SIZE
      if  Barrels_count[k] = 0
            then do  【case1】
      else //【case2】桶里非空
            Barrels_tmp[Barrels_tmp_count].key = s[i]  //在Barrels_tmp里取一个来装key
	    Barrels_tmp[Barrels_tmp_count].num = i
	    Barrels_tmp[Barrels_tmp_count].next = NULL
            p = &Barrels[k]
	    while (p->next != NULL)   //找合适的,即插入点的pre结点
				p = p->next
	    p->next = &Barrels_tmp[Barrels_tmp_count]  //加入链表,放入桶里
	    Barrels_tmp[Barrels_tmp_count].pre = p  
	    if  s[i] < p->key  //【case2.1】如果s[i]比p的值小,那么就需要调整
                      if  s[i] <= Barrels[k].key  //【case2.1.1】如果s[i]不大于第一个数,那么可以把s[i]当初首元素
                                then  do  【case2.1.1】
                      else  //【case2.1.2】s[i]大于第一个数
                                then  do  【case2.1.2】
	    else  //【case2.2】s[i]大于p的值,那么只需要将s[i]接到链表的最后即可
                     then do  【case2.2】

总的流程图如下:

桶排序

桶排序

桶排序

桶排序

今天的文章桶排序分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/5057.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注