1.这是比较简单的桶排序,没有将每个桶内的数据用链表连接。
#include <iostream>
#include <ctime>
using namespace std;
const int length=105;//桶的个数
const int max_num = 100;
const int arr_len = 10;//数组的长度
void bucket_sort(int arr[],int n){
int bucket[length];
for(int i=0;i<length;i++)
bucket[i]=0;
//存入数据
for(int i=0;i<n;i++){
bucket[arr[i]]++;
}
//排序
for(int i=0 , j=0;i<length;i++){
while(bucket[i]>0){//桶是有序的,按序把数据放入数组
arr[j] = i;
bucket[i]--;
j++;
}
}
}
void print_sort(int arr[],int n){
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main(){
srand((int)time(NULL));
int arr[arr_len];
for(int i=0;i<arr_len;i++)
arr[i] = rand()%max_num;
cout<<"before sort: "<<endl;
print_sort(arr,arr_len);
bucket_sort(arr,arr_len);
cout<<"after sort: "<<endl;
print_sort(arr,arr_len);
system("pause");
return 0;
}
运行结果:
2.使用链表
#include <iostream>
#include <vector>
#include <iterator>
#include <ctime>
using namespace std;
//桶排序,从小到大
const int bucket_size = 10;
const int arr_size = 20;
const int max_num = 100;
struct LinkList
{
explicit LinkList(int i=0):data(i),pNext(NULL){}
int data;
LinkList *pNext;
};
LinkList* insert_bucket(LinkList *head,int val){ //每个桶内的数据用链表连接
LinkList *new_bucket = new LinkList();
new_bucket->data = val;
LinkList p ;
LinkList *pre,*cur;
p.pNext = head;
pre = &p;
cur = head;
while(cur != NULL && cur->data <= val){ //找到合适的插入位置,直到待插入的数据比当前数据大
pre = cur;
cur = cur->pNext;
}
pre->pNext = new_bucket;
new_bucket->pNext = cur;
return p.pNext;
}
LinkList* Merge(LinkList *head1,LinkList *head2){ //将各个桶链接
LinkList merge;
LinkList *merge_bucket = &merge;
while(head1 != NULL && head2 != NULL){
if(head1->data <= head2->data){
merge_bucket->pNext = head1;
head1 = head1->pNext;
}
else{
merge_bucket->pNext = head2;
head2 = head2->pNext;
}
merge_bucket = merge_bucket->pNext;
}
if(head1 != NULL) merge_bucket->pNext = head1;
if(head2 != NULL) merge_bucket->pNext = head2;
return merge.pNext;
}
//分桶
//链表插入
//桶连接
void sort_bucket(int arr[],int n){
int index = 0;
vector<LinkList*> bucket(bucket_size,(LinkList*)(0)); //利用vector容器存放数据
for(int i=0;i<n;i++){
index = arr[i] / bucket_size; //用 / 将数据分到不同的桶里面
LinkList *head = bucket.at(index); //at等同于[],但at会做边界检查,如果越界,会抛出异常
bucket.at(index) = insert_bucket(head,arr[i]);
}
LinkList *head = bucket.at(0);
for(int i=1;i<bucket_size;i++){ //从1开始
head = Merge(head,bucket.at(i));
}
for(int i=0;i<n;i++){
arr[i] = head->data;
head = head->pNext;
}
}
int main(){
srand((int)time(NULL));
int arr[arr_size];
for(int i=0;i<arr_size;i++)
arr[i] = rand() % max_num; //随机数放入数组
sort_bucket(arr,arr_size);
for(int i=0;i<arr_size;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
运行结果: