桶排序


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


---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;
}



發佈了49 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章