/********************************************************************************/ //桶排序->利用線性鏈表實現 //定義結點結構體 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; } } } }