桶排序


对位数相同的浮点数进行排序的常规方法 这里用整数代替浮点数实现 借用哈西查找的方式分桶已达到大小整块分离的目的 桶内各自排序 再将桶连接起来则理论上排序完成


---C语言实现

---桶内数据放入时排序

---整数代替浮点数

---实现步骤:

----------------- 1.哈希分桶并桶内排序

----------------- 2.按桶倒回原数组

----------------- 3.释放空间

#include<stdio.h>
#include<stdlib.h>
#include <windows.h>

#define STANARDSEPDATA 10
typedef struct bucketnode
{
	int value;
	struct bucketnode *pNext;
}BucketNode;
//遍历数组
void LoopForArr(int arr[],int length)
{
	int count;
	if(arr == NULL || length <=0)return ;
	for(count = 0;count<length;count++)
	{
		printf("%d  ",arr[count]);
	}
	printf("\n");
}

//利用哈希分桶 数据放入桶内时排序
BucketNode ** CreateHashForBucketSort(int arr[],int length)
{
	int min;
	int max;
	int count;
	BucketNode **Head = NULL;
	BucketNode *Temp = NULL;
	BucketNode *Temp_in = NULL;
	BucketNode *Temp_in_last = NULL;
	min = max = arr[0]/STANARDSEPDATA;
	for(count = 1;count<length;count++)
	{
		min = min<arr[count]/STANARDSEPDATA?min:arr[count]/STANARDSEPDATA;
		max = max>arr[count]/STANARDSEPDATA?min:arr[count]/STANARDSEPDATA;
	}
	Head = (BucketNode **)malloc(sizeof(BucketNode* )*(max-min+1));
	memset(Head,0,sizeof(BucketNode* )*(max-min+1));

	//插入时排序
	for(count = 0;count<length;count++)
	{
		Temp = (BucketNode *)malloc(sizeof(BucketNode ));
		Temp->value = arr[count];
		Temp->pNext = NULL;
		if( !Head[arr[count]/STANARDSEPDATA-min] )
		{
			Head[arr[count]/STANARDSEPDATA-min] = Temp;
		}
		else
		{
			Temp_in_last = Temp_in = Head[arr[count]/STANARDSEPDATA-min];
			while(Temp_in)
			{
				if(Temp_in->value>Temp->value)
				{
					Temp->pNext = Temp_in;
					if(Temp_in == Head[arr[count]/STANARDSEPDATA-min])
						Head[arr[count]/STANARDSEPDATA-min] = Temp;
					else
						Temp_in_last->pNext = Temp;
					break;
				}
				Temp_in_last = Temp_in;
				Temp_in = Temp_in->pNext;
			}
			if(!Temp_in)
				Temp_in_last->pNext = Temp;
		}
	}
	return Head;
}

//桶排序
void BucketSort(int arr[],int length)
{
	int count;
	BucketNode * Temp = NULL;
	BucketNode * Del = NULL;
	int count_hash;
	BucketNode **Head = NULL;
	if(arr == NULL || length <=0)return ;

	//分桶并排序
	Head = CreateHashForBucketSort(arr,length);
	//倒回原数组
	count = 0;
	count_hash = 0;
	while(count<length)
	{
		while(!Head[count_hash])
			count_hash++;
		Temp = Head[count_hash];
		while(Temp)
		{
			arr[count++] = Temp->value;
			Temp = Temp->pNext;
		}
		count_hash++;
	}

	//释放空间
	--count_hash;
	while(count_hash>=0)
	{
		Temp = Head[count_hash];
		while(Temp)
		{
			Del = Temp;
			Temp = Temp->pNext;
			free(Del);
			Temp = NULL;
		}
		count_hash--;
	}
	free(Head);
	Head = NULL;
}

int main()
{
	int arr[] = {36,49,35,12,28,16,17,31,26,55,66,91};
	BucketSort(arr,sizeof(arr)/sizeof(arr[0]));
	LoopForArr(arr,sizeof(arr)/sizeof(arr[0]));
	system("pause");
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值