/********************************************************************************/
//桶排序->利用线性链表实现
//定义结点结构体
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
今日推荐
周排行