簡(jiǎn)單掌握桶排序算法及C++版的代碼實(shí)現(xiàn)
桶排序介紹
桶排序(Bucket Sort)的原理很簡(jiǎn)單,它是將數(shù)組分到有限數(shù)量的桶子里。
假設(shè)待排序的數(shù)組a中共有N個(gè)整數(shù),并且已知數(shù)組a中數(shù)據(jù)的范圍[0, MAX)。在桶排序時(shí),創(chuàng)建容量為MAX的桶數(shù)組r,并將桶數(shù)組元素都初始化為0;將容量為MAX的桶數(shù)組中的每一個(gè)單元都看作一個(gè)"桶"。
在排序時(shí),逐個(gè)遍歷數(shù)組a,將數(shù)組a的值,作為"桶數(shù)組r"的下標(biāo)。當(dāng)a中數(shù)據(jù)被讀取時(shí),就將桶的值加1。例如,讀取到數(shù)組a[3]=5,則將r[5]的值+1。
C++實(shí)現(xiàn)算法
假設(shè)數(shù)據(jù)分布在[0,100)之間,每個(gè)桶內(nèi)部用鏈表表示,在數(shù)據(jù)入桶的同時(shí)插入排序。然后把各個(gè)桶中的數(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)文章
如何基于 Blueprint 在游戲中創(chuàng)建實(shí)時(shí)音視頻功能
我們?cè)诒疚南葋碇v講如何在 Unreal 中用 Blueprint 快速實(shí)現(xiàn)。稍后會(huì)分享基于 C++的實(shí)現(xiàn)步驟。感興趣的朋友跟隨小編一起看看吧2020-05-05
C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問題
這篇文章主要介紹了std::queue中遇到釋放內(nèi)存錯(cuò)誤的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
C語言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了C語言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11

