排序算法-桶排序(两种写法)

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;
}


运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值