簡略控制桶排序算法及C++版的代碼完成。本站提示廣大學習愛好者:(簡略控制桶排序算法及C++版的代碼完成)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略控制桶排序算法及C++版的代碼完成正文
桶排序引見
桶排序(Bucket Sort)的道理很簡略,它是將數組分到無限數目的桶子裡。
假定待排序的數組a中共有N個整數,而且已知數組a中數據的規模[0, MAX)。在桶排序時,創立容量為MAX的桶數組r,並將桶數組元素都初始化為0;將容量為MAX的桶數組中的每個單位都看做一個"桶"。
在排序時,逐一遍歷數組a,將數組a的值,作為"桶數組r"的下標。當a中數據被讀取時,就將桶的值加1。例如,讀取到數組a[3]=5,則將r[5]的值+1。
C++完成算法
假定數據散布在[0,100)之間,每一個桶外部用鏈表表現,在數據入桶的同時拔出排序。然後把各個桶中的數據歸並。
#include<iterator> #include<iostream> #include<vector> using namespace std; const int BUCKET_NUM = 10; struct ListNode{ explicit ListNode(int i=0):mData(i),mNext(NULL){} ListNode* mNext; int mData; }; ListNode* insert(ListNode* head,int val){ ListNode dummyNode; ListNode *newNode = new ListNode(val); ListNode *pre,*curr; dummyNode.mNext = head; pre = &dummyNode; curr = head; while(NULL!=curr && curr->mData<=val){ pre = curr; curr = curr->mNext; } newNode->mNext = curr; pre->mNext = newNode; return dummyNode.mNext; } ListNode* Merge(ListNode *head1,ListNode *head2){ ListNode dummyNode; ListNode *dummy = &dummyNode; while(NULL!=head1 && NULL!=head2){ if(head1->mData <= head2->mData){ dummy->mNext = head1; head1 = head1->mNext; }else{ dummy->mNext = head2; head2 = head2->mNext; } dummy = dummy->mNext; } if(NULL!=head1) dummy->mNext = head1; if(NULL!=head2) dummy->mNext = head2; return dummyNode.mNext; } void BucketSort(int n,int arr[]){ vector<ListNode*> buckets(BUCKET_NUM,(ListNode*)(0)); for(int i=0;i<n;++i){ int index = arr[i]/BUCKET_NUM; ListNode *head = buckets.at(index); buckets.at(index) = insert(head,arr[i]); } ListNode *head = buckets.at(0); for(int i=1;i<BUCKET_NUM;++i){ head = Merge(head,buckets.at(i)); } for(int i=0;i<n;++i){ arr[i] = head->mData; head = head->mNext; } }