博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
桶排序/Bucket Sort
阅读量:4652 次
发布时间:2019-06-09

本文共 2015 字,大约阅读时间需要 6 分钟。

桶排序(bucket sort)是一种时间复杂度为线性时间(O(n))的排序。

其原理如下:(参考算法导论第8章)

桶排序将[0,1)区间划分为n个大小相同的子区间,每个子区间称之为桶。桶与桶之间是有序的。

对于n个输入的数,分别落入不同每一个桶中。
落入同一个桶中的元素在结点接入的过程中要查找到其对应的位置。
最终排好序的输出是由每个桶里的链表依次连接而成的。

 

用简单的话来打个比方:

假设n为10
则桶的编号为B[0]、B[1]、...B[9]
对于arr[m]中输入的元素:
0.01落入B[0]中,0.63落入B[6]中,0.88落入B[8]中……
而落入同一个桶中的元素0.37、0.38、0.31在桶中呈如下排列(链表有序)
B[3]->(0.31)->(0.37)->(0.38)
最后再按照B[0]、B[1]、...B[9]的顺序 可以抽象地理解为把链表像烤章鱼小丸子似的按顺序串起来
放回原来的数组arr[m]中

其算法过程可以分为以下四个部分:

1、建立桶、清空桶
2、遍历输入集、放入桶
3、桶内查找正确位置,接入链表
4、桶的排放顺序将链表里的元素放回输入集中

详细实现与注解见详细代码:

1 #include
2 using namespace std; 3 struct Node//声明链表结点 4 { 5 double value; 6 Node *next; 7 }; 8 void bucketsort(double *arr,int length) 9 {10 Node key[10];11 int number=0;12 Node *p,*q;13 int index=0;14 /*1、建立桶、清空桶*/15 for(int i=0; i<10; i++)16 {17 key[i].value=0;18 key[i].next=NULL;19 }20 for(int i=0; i
value=arr[i];25 ins->next=NULL;26 number=arr[i]*10;//计算该元素在这排桶中对应的下标27 /*3、桶内查找正确位置,接入链表*/28 if(key[number].next==NULL)//如果当前桶为空,则直接接入元素29 {30 key[number].next=ins;31 }32 else//否则顺着链表向下查找当前arr[i]元素的插入位置。33 {34 p=&key[number];35 q=key[number].next;36 while((q!=NULL)&&(q->value<=arr[i]))37 {38 q=q->next;39 p=p->next;40 }41 ins->next=q;42 p->next=ins;43 }44 }45 /*4、桶的排放顺序将链表里的元素放回输入集*/46 for(int i=0; i<10; i++)47 {48 p=key[i].next;49 if(p==NULL) continue;50 while(p!=NULL)//把桶里的元素放回数组51 {52 arr[index++]=p->value;53 p=p->next;54 }55 56 }57 }58 59 int main()60 {61 double arr[]= {
0.56,0.17,0.23,0.94,0.55,0.67,0.81,0.94,0.13,0.48};62 bucketsort(arr,10);63 for(int i=0; i<10; i++)64 {65 cout<
<<" ";66 }67 cout<

 

转载于:https://www.cnblogs.com/AKsnoopy/p/8574576.html

你可能感兴趣的文章
Chord算法(原理)
查看>>
扩展点(持续更新......)
查看>>
TortoiseSVN服务器ip地址修改后如何使用
查看>>
flex RemoteObject 的两种使用方法
查看>>
Oracle EBS R12多组织(多OU)访问架构
查看>>
小强的HTML5移动开发之路(2)——HTML5的新特性
查看>>
利用Delphi编写IE扩展
查看>>
chrome插件Vimium快捷键
查看>>
Spring Boot 注解
查看>>
自己常看的政评
查看>>
10000以内的N!
查看>>
找到多个与名为“Login”的控制器匹配的类型
查看>>
DrawerLayout的openDrawer()和closeDrawer()方法
查看>>
Drawing with GoogLeNet
查看>>
Rolling in the Deep (Learning)
查看>>
Eigenvectors and eigenvalues
查看>>
【bfs】noip模拟赛 栅栏迷宫
查看>>
4分钟学会网页样式
查看>>
springboot freeMarker
查看>>
Getting started with Processing 第九章总结
查看>>