對位數相同的浮點數進行排序的常規方法 這裏用整數代替浮點數實現 借用哈西查找的方式分桶已達到大小整塊分離的目的 桶內各自排序 再將桶連接起來則理論上排序完成
---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;
}