国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

簡單掌握桶排序算法及C++版的代碼實現

2020-05-23 14:02:05
字體:
來源:轉載
供稿:網友

桶排序介紹
桶排序(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; }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 上林县| 金门县| 浑源县| 闽侯县| 陈巴尔虎旗| 宣武区| 大姚县| 屯昌县| 海兴县| 福安市| 孟州市| 彭泽县| 巴彦县| 勃利县| 西乌| 昌吉市| 贞丰县| 扶绥县| 大同县| 镇康县| 濮阳市| 弥渡县| 卢湾区| 厦门市| 启东市| 安义县| 蓬莱市| 红桥区| 凉山| 阳江市| 藁城市| 赞皇县| 崇仁县| 南靖县| 乌鲁木齐县| 张家界市| 靖安县| 陆丰市| 永州市| 邛崃市| 贡山|