簡單掌握桶排序算法及C++版的代碼實現(xiàn)
桶排序介紹
桶排序(Bucket Sort)的原理很簡單,它是將數(shù)組分到有限數(shù)量的桶子里。
假設(shè)待排序的數(shù)組a中共有N個整數(shù),并且已知數(shù)組a中數(shù)據(jù)的范圍[0, MAX)。在桶排序時,創(chuàng)建容量為MAX的桶數(shù)組r,并將桶數(shù)組元素都初始化為0;將容量為MAX的桶數(shù)組中的每一個單元都看作一個"桶"。
在排序時,逐個遍歷數(shù)組a,將數(shù)組a的值,作為"桶數(shù)組r"的下標(biāo)。當(dāng)a中數(shù)據(jù)被讀取時,就將桶的值加1。例如,讀取到數(shù)組a[3]=5,則將r[5]的值+1。
C++實現(xiàn)算法
假設(shè)數(shù)據(jù)分布在[0,100)之間,每個桶內(nèi)部用鏈表表示,在數(shù)據(jù)入桶的同時插入排序。然后把各個桶中的數(shù)據(jù)合并。
#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; } }
相關(guān)文章
C/C++: Inline function, calloc 對比 malloc
以下是對c/c++中的malloc函數(shù)與calloc函數(shù)的區(qū)別以及它們之間的聯(lián)系進行了介紹,需要的朋友可以過來參考下2016-07-07C/C++判斷傳入的UTC時間是否當(dāng)天的實現(xiàn)方法
在項目中經(jīng)常會顯示一個時間,如果這個時間在今日內(nèi)就顯示為時分秒,否則顯示為年月日,有需要的朋友可以參考一下2014-01-01c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式
這篇文章主要介紹了c++將vector迭代器轉(zhuǎn)換為指針的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11