/********************************************************************************/ //桶排序->利用线性链表实现 //定义结点结构体 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; } } } }