桶排序(BucketSort)
1 桶排序核心思想是 根据数据规模n划分 m个相同大小的区间 (每个区间为一个桶,桶可理解为容器)
2 每个桶存储区间内的元素(区间为半开区间 例如[0,10) 或者 [200,300) )
3 将n个元素按照规定范围分布到各个桶中去
4 对每个桶中的元素进行排序,排序方法可根据需要,选择快速排序,或者归并排序,或者插入排序
5 依次从每个桶中取出元素,按顺序放入到最初的输出序列中(相当于把所有的桶中的元素合并到一起)
6 桶可以通过数据结构链表实现
7 基于一个前提,待排序的n个元素大小介于0~k 之间的整数 或者是(0, 1)的浮点数也可(算法导论8.4的例子)
8 桶排序的时间代价,假设有m个桶,则每个桶的元素为n/m
当辅助函数为冒泡排序O(n2) ,桶排序为 O(n)+mO((n/m)2)
当辅助函数为快速排序时O(nlgn), 桶排序为 O(n)+mO(n/m log(n/m))
9 通常桶越多,执行效率越快,即省时间,但是桶越多,空间消耗就越大,是一种通过空间换时间的方式
注意:代码前部分为辅助代码
辅助类:链表Link
辅助函数:冒泡排序BubbleSort
- #include <iostream>
- #include <crtdbg.h>
- #include <cstring>
- using namespace std;
- typedef int DataType;
- //建立链表
- class Link
- {
- private:
- struct Node
- {
- DataType data;
- Node *next;
- };
- Node *head; //哨兵位
- public:
- Link()
- {
- Init();
- }
- ~Link()
- {
- Delete();
- }
- void Init()
- {
- head = new Node;
- head->next = NULL;
- }
- void Delete()
- {
- for (Node *p = head; p != NULL;)
- {
- Node *pTemp = p->next;
- delete p;
- p = pTemp;
- }
- head = NULL;
- }
- void Print()
- {
- for (Node *p = head->next; p != NULL; p = p->next)
- {
- cout << p->data << endl;
- }
- }
- //顺序插入 考虑两种情况 1.空表 2.当插入值是最大值的时候
- void SortInsert(DataType data)
- {
- Node *p = head;
- do
- {
- if (p->next == NULL || p->next->data > data)
- {
- Node *pNew = new Node;
- pNew->data = data;
- pNew->next = p->next;
- p->next = pNew;
- return;
- }
- p = p->next;
- } while (true);
- }
- //尾插法直接插入
- void Insert(DataType data)
- {
- Node *p = head;
- while(p->next != NULL)
- {
- p = p->next;
- }
- Node *pNew = new Node;
- pNew->data = data;
- pNew->next = NULL;
- p->next = pNew;
- }
- bool Empty()
- {
- return head->next == NULL;
- }
- //去掉首结点并返回首结点的值
- int ExtractDate()
- {
- if (! Empty())
- {
- DataType data = head->next->data;
- Node *p = head->next;
- Node *pFirst = p->next;
- delete p;
- p = NULL;
- head->next = pFirst;
- return data;
- }
- return -;
- }
- };
- //冒泡排序
- void BubbleSort(int *a, int size)
- {
- for(int i=; i<size; ++i)
- {
- for (int j=; j<size--i; ++j)
- {
- if (a[j] > a[j+])
- {
- int tmp = a[j];
- a[j] = a[j+];
- a[j+] = tmp;
- }
- }
- }
- }
- //基于一个前提:待排序的n个元素大小是介于 0~k 之间的整数
- //array待排序数组,result辅助数组存储排序结果,k为允许的最大整数
- void BucketSort(int array[], int result[], int size, int k)
- {
- Link *Bucket = new Link[]; //建立桶
- int sectionSize = k/; //记录区间大小
- int index=; //记录区间下标
- //方法1:一般步骤
- //按照范围把array中的每个值放入相应的桶中
- for(int i=; i<size; ++i)
- {
- index = array[i]/sectionSize;
- Bucket[index].Insert(array[i]); //为保证稳定性,链表使用了尾插法插入
- }
- //遍历每个桶,取出桶中的元素,放入辅助数组result,并排序
- int j= , m=;
- for (int i=; i<; ++i)
- {
- m = j; //记录已排好序的数组元素大小
- while(!Bucket[i].Empty())
- {
- result[j++] = Bucket[i].ExtractDate();
- }
- //可根据实际情况选择快速排序,堆排序等,此处简单起见选择冒泡排序
- BubbleSort(result+m, j-m);
- }
- //方法2:使用链表特性,在插入链表的同时排序
- //for(int i=0; i<size; ++i)
- //{
- // index = array[i]/sectionSize;
- // Bucket[index].SortInsert(array[i]);
- //}
- //int j=0;
- //for(int i=0; i<5; ++i)
- //{
- // while(!Bucket[i].Empty())
- // {
- // result[j++] = Bucket[i].ExtractDate();
- // }
- //}
- delete [] Bucket;
- }
- void main()
- {
- //检测是否有内存泄露 需要加头文件#include <crtdbg.h>
- _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
- int Array[] = {, , , , , , , , , };
- int Result[] = {};
- BucketSort(Array, Result, sizeof(Array)/sizeof(Array[]), );
- for (int i= ; i < ; ++i)
- {
- cout << Result[i] << "\n";
- }
- system("pause");
- }
(转载请注明作者和出处^_* Seven++ http://www.cnblogs.com/sevenPP/ )
桶排序(BucketSort)的更多相关文章
- Java基础知识强化51:经典排序之桶排序(BucketSort)
1. 首先说明三点: (1)桶排序是稳定的 (2)桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 (3)桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 2. 桶排序的分析 ...
- 基于非比較的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)
计数排序 条件:要排序的数组的元素必须是在一定范围的,比方是1~100.在排序之前我们必须知道数组元素的范围. 思路:顾名思义:就是用一个数组来计数的. 步骤: 1.用一个数组来计数count[ ], ...
- BucketSort(桶排序)原理及C++代码实现
桶排序假设输入数据服从均匀分布,平均情况下它的时间复杂度为O(n). 桶排序将输入数据的区间均匀分成若干份,每一份称作“桶”.分别对每一个桶的内容进行排序,再按桶的顺序输出则完成排序. 通常使用链表来 ...
- 计数排序和桶排序(Java实现)
目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比 ...
- Java排序算法——桶排序
文字部分为转载:http://hxraid.iteye.com/blog/647759 对N个关键字进行桶排序的时间复杂度分为两个部分: (1) 循环计算每个关键字的桶映射函数,这个时间复杂度是O(N ...
- Hark的数据结构与算法练习之桶排序
算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将1 ...
- Python线性时间排序——桶排序、基数排序与计数排序
1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...
- 桶排序与基数排序代码(JAVA)
桶排序 publicstaticvoid bucketSort(int[] a,int max){ int[] buckets; if(a==null || m ...
- Java实现桶排序和基数排序
桶排序代码: import java.util.Arrays; /** * 桶排序 * 工作的原理是将数组分到有限数量的桶里 * 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序 ...
随机推荐
- JNI-数据类型
转载:http://blog.csdn.net/conowen/article/details/7523145 在Java中有两类数据类型:primitive types,如,int, float, ...
- <meta 标签的详细使用
meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:na ...
- Scribefire发CSDN博客
历史 在非常久非常久曾经,CSDN是支持外部工具来写文章的,但是在还有一个非常久非常久曾经就不行了. 突然看到CSDN有能够用外部工具来写博客了(CSDN的公告),一直以来都纠结这个问题,CSDN的编 ...
- 提高你的Java代码质量吧:如果有必要,使用变长数组吧
一.分析 Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景 比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...
- Tricks Device (hdu 5294 最短路+最大流)
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- ClientKey实现登录QQ空间,并设置背景音乐
ClientKey大家都知道的,通过webbrowser登录后取得Cookie并计算出GTK,即可操作空间的POST. 源代码中引用了苏飞的Http类库,自己修改添加了一些拓展方法. 下载地址:htt ...
- java与c++的访问权限的问题
转自网络:http://blog.sina.com.cn/s/blog_4bc954d30100wtxe.html 权限的理解重要理解什么是可见什么是不可见 首先声明:java中,friendly这个 ...
- 如何真正免费运营推广APP应用
随着移动终端的迅速普及,各类APP如雨后春笋般涌现出来,但是真正的运营成功的产品却寥寥无几. 从瓜分渠道资源到抢占用户的过程中,很多同行都明显的感觉到,渠道平台所带来的量日益减少,但是刊例价格却一再攀 ...
- jemalloc源码结构分析(一):内存申请处理过程
一.5种malloc方法 1)tcache_alloc_small 2)arena_malloc_small 3)tcache_alloc_large 4)arena_malloc_large 5)h ...
- HeaderTemplate
前台代码: <asp:Repeater ID="rptList" runat="server" onitemdatabound="doSomet ...