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