php桶排序,C++_简单掌握桶排序算法及C++版的代码实现,桶排序介绍 桶排序(Bucket Sort) - phpStudy...

简单掌握桶排序算法及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

#include

#include

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 buckets(BUCKET_NUM,(ListNode*)(0));

for(int i=0;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

head = Merge(head,buckets.at(i));

}

for(int i=0;i

arr[i] = head->mData;

head = head->mNext;

}

}

相关阅读:

支持IE8的纯css3开发的响应式设计动画菜单教程

Android实现微信自动抢红包的程序

CSS实现HTML背景图片拉伸铺满示例

Yii2中YiiBase自动加载类、引用文件方法分析(autoload)

php命令行用法入门实例教程

js报$ is not a function 的问题的解决方法

c#判断字符是否为中文的三种方法分享(正则表达式判断)

Android中SparseArray性能优化的使用方法

JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法

Java设计模式之Strategy模式

表单元素属性readonly和disabled使用对比

13 招教你用好 Mac 的预览 app

PHP使用header()输出图片缓存实例

虚拟机linux端mysql数据库无法远程访问的解决办法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值