排序算法——桶排序

七、桶排序(Bucket Sort)

  要使桶排序正常运行,需要额外的信息:

  输入A1,A2,...,AN必须只由小于M的正整数构成,即Ai<M。使用一个大小为M的数组result,初始化为全0。数组有M个单元,即M个桶(bucket)。

 1 void bucketSort(vector<int> &a, const int maxVal)
 2 {
 3     //int result[maxVal] = { 0 };
 4     /* 初始化桶 */
 5     for (int i = 0; i < maxVal; i++)
 6     {
 7         result[i] = 0;
 8     }
 9     /* 读入数据装桶 */
10     for (int i = 0; i < a.size(); i++)
11     {
12         result[a[i]]++;
13     }
14     /* 将桶中的每个数打印出来,出现几次就打印几次 */
15     for (int i = 0; i < maxVal; i++)16         for (int j = 0; j < result[i]; j++)
17         {
18             cout << i << endl;
19         }20 }

步骤:

  result[Ai]中存放的是Ai出现的次数;

读入Ai时,result[Ai]增1;  

  所有输入数据读入后,扫描数组result,打印出排序后的数据,result[Ai]值是n,Ai就打印n次.

eg.

输入数组{1,4,5,3,7,8,4,9,6,5,0},最大为9,另建一个大小为10的数组,初始化为全0。

读入数组:

  遇到1,将result[1]加1

  遇到4,将result[4]加1

  ......

  遇到5,将result[5]加1

  遇到0,将result[0]加1

得到结果:

  

打印结果:

  0 1 3 4 4 5 5 6 7 8 9

时间复杂度:

  算法用时O(M+N),M为桶的个数,N为待排序数组的大小。

空间复杂度:

  O(M+N)

如果输入数据非常庞大,桶的数量会非常多,空间代价将会非常大。 

  

  

  

时间: 2024-10-08 14:53:56

排序算法——桶排序的相关文章

经典排序算法 - 桶排序Bucket sort

经典排序算法 - 桶排序Bucket sort 补充说明三点 1,桶排序是稳定的 2,桶排序是常见排序里最快的一种,比快排还要快-大多数情况下 3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 我自己的理解哈,可能与网上说的有一些出入,大体都是同样的原理 无序数组有个要求,就是成员隶属于固定(有限的)的区间,如范围为[0-9](考试分数为1-100等) 例如待排数字[6 2 4 1 5 9] 准备10个空桶,最大数个空桶 [6 2 4 1 5 9]           待排

排序算法 -- 桶排序

排序算法 -- 目录 桶排序 (Bucket sort)或所谓的箱排序的原理是将数组分到有限数量的桶子里,然后对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的合并起来. 排序过程: 假设待排序的一组数统一的分布在一个范围中,并将这一范围划分成几个子范围,也就是桶 将待排序的一组数,分档规入这些子桶,并将桶中的数据进行排序 将各个桶中的数据有序的合并起来 Data Structure Visualizations 提供了一个桶排序的分

排序算法----桶排序(数组)

桶排序是一种效率很高的排序算法,它的时间复杂度为O(N+M),(N个元素,范围为0--M),但桶排序有一定的限制,必须为非负整数,而且元素不宜过大. 算法思想: 设待排序序列的元素取值范围为0到m,则我们新建一个大小为m+1的临时数组并把初始值都设为0,遍历待排序序列,把待排序序列中元素的值作为临时数组的下标,找出临时数组中对应该下标的元素使之+1:然后遍历临时数组,把临时数组中元素大于0的下标作为值按次序依次填入待排序数组,元素的值作为重复填入该下标的次数,遍历完成则排序结束序列有序. 1 v

线性排序算法---- 计数排序, 基数排序, 桶排序

排序算法里,除了比较排序算法(堆排序,归并排序,快速排序),还有一类经典的排序算法-------线性时间排序算法.听名字就让人兴奋! 线性时间排序,顾名思义,算法复杂度为线性时间O(n) , 非常快,比快速排序还要快的存在,简直逆天.下面我们来仔细看看三种逆天的线性排序算法, 计数排序,基数排序和桶排序. 1计数排序  counting Sort 计数排序 假设 n个 输入元素中的每一个都是在 0 到 k 区间内的一个整数,当 k= O(N) 时,排序运行的时间为 O(N). 计数排序的基本思想

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

综述 最近复习了各种排序算法,记录了一下学习总结和心得,希望对大家能有所帮助.本文介绍了冒泡排序.插入排序.选择排序.快速排序.归并排序.堆排序.计数排序.桶排序.基数排序9种经典的排序算法.针对每种排序算法分析了算法的主要思路,每个算法都附上了伪代码和C++实现. 算法分类 原地排序(in-place):没有使用辅助数据结构来存储中间结果的排序**算法. 非原地排序(not-in-place / out-of-place):使用了辅助数据结构来存储中间结果的排序算法 稳定排序:数列值(key)

【算法】计数排序、桶排序和基数排序详解

01.计数排序.桶排序与基数排序 并不是所有的排序 都是基于比较的,计数排序和基数排序就不是.基于比较排序的排序方法,其复杂度无法突破\(n\log{n}\) 的下限,但是 计数排序 桶排序 和基数排序是分布排序,他们是可以突破这个下限达到O(n)的的复杂度的. 1. 计数排序 概念 计数排序是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,使用 C[i] 来计算 i 出现的次数.然后根据数C来将原数组A中的元素排到正确的位置. 复杂度 计数排序的最坏时间复杂度.最好时间复杂度.平均时

算法学习-02(希尔排序,计数排序,桶排序,基数排序)

希尔排序 # 希尔排序 # 希尔排序是对插入排序的升级改造 # 它的大致流程是 # 1.将长度为n的序列 分为d = n//2组 # 2.使每一组变的有序 # 3.将序列分为 d1 = d // 2 组 # 4.将每一组变的有序 # 5.直到最后 d 小于等于 0 def inster_sort_gap(li,gap): for i in range(gap,len(li)): tmp = li[i] j = i - gap while j >= 0 and tmp > li[j]: li[j

经典排序算法 - 耐心排序Patience Sorting

经典排序算法 - 耐心排序Patience Sorting 这个排序的关键在建桶和入桶规则上 建桶规则:如果没有桶,新建一个桶;如果不符合入桶规则那么新建一个桶 入桶规则:只要比桶里最上边的数字小即可入桶,如果有多个桶可入,那么按照从左到右的顺序入桶即可 举个例子,待排数组[6 4 5 1 8 7 2 3] 第一步,取数字6出来,此时一个桶没有,根据建桶规则1新建桶,将把自己放进去,为了表述方便该桶命名为桶1或者1号桶 第二步,取数字4出来,由于4符合桶1的入桶规则,所以入桶1,并放置在6上边,

经典排序算法 - 计数排序Counting sort

经典排序算法 - 计数排序Counting sort 注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶 看下具体的过程,一共需要三个数组,分别是待排数组,票箱数组,和桶数组 var unsorted = new int[] { 6, 2, 4, 1, 5, 9 };  //待排数组 var ballot = new int[unsorted.Len