程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 簡略控制桶排序算法及C++版的代碼完成

簡略控制桶排序算法及C++版的代碼完成

編輯:關於C++

簡略控制桶排序算法及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;
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved