数据结构-排序算法-桶排序

/********************************************************************************/
//桶排序->利用线性链表实现
//定义结点结构体
struct node
{
	int value;
	node* nextNode=nullptr;
};
typedef node* nodePtr;  //结点指针
//桶排序
void bucketSort(int *a, int dataNum)
{
	nodePtr bucketArray[10] = { nullptr,nullptr,nullptr,nullptr,nullptr,nullptr,
		nullptr, nullptr, nullptr, nullptr};//定义0-9共十个桶,用于存放每个桶内的数据结点头指针
	for (int i=0;i<10;i++)
	{
		bucketArray[i] = new node;
	}
	//找出数据的最大位,个位为0,十位为1
	int maxValue = a[0];
	for (int i = 0; i < dataNum; i++)
	{
		maxValue = a[i] > maxValue ? a[i] : maxValue;
	}
	int maxPlace = 0;
	while (maxValue/10!=0)
	{
		maxPlace++;
		maxValue /= 10;
	}
	//从个位到最高为依次入桶出桶
	int div = 1;
	for (int i=0;i<=maxPlace;i++)
	{
		int temp = 0;
		for (int j = 0; j < dataNum; j++)
		{
			temp = i == 0 ? a[j] % 10 : a[j] / div%10;
			nodePtr pNode = new node;
			pNode->nextNode = nullptr;
			pNode->value = a[j];
			nodePtr tempNodePtr = bucketArray[temp];
			//构建线性链表
			while (tempNodePtr->nextNode != nullptr)
			{
				tempNodePtr = tempNodePtr->nextNode;
			}
			tempNodePtr->nextNode = pNode;
		}
		div *= 10;
		//依次取出桶中数据放入a中
		int index = 0;
		for (int i=0;i<10;i++)
		{
			nodePtr tempNodePtr = bucketArray[i];
			while (tempNodePtr->nextNode!=nullptr)
			{
				a[index++] = tempNodePtr->nextNode->value;
				nodePtr deleteNode = tempNodePtr->nextNode;
				tempNodePtr->nextNode = tempNodePtr->nextNode->nextNode;
				delete deleteNode;
				deleteNode = nullptr;
			}
		}
	}
}

猜你喜欢

转载自my.oschina.net/u/3397950/blog/1791740