`
北极的。鱼
  • 浏览: 158910 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】桶排序(Bucket Sort)

 
阅读更多

转自: http://blog.csdn.net/weiwenhp/article/details/8618500

 

桶排序的思想和基数排序有点类似,都要借助临时空间.基数排序是先映射到大小为10的计数数组中,然后再映射到大小等于待排序数组长度的临时数组中.

而桶排序就是直接整个足够大的临时数组,把待排序的元素全部映射过来.其索引为待排序元素数值.所以为了确定临时数组的大小得先算出数组中最大数.

 

简单桶排序

简单桶排序的缺点很明显

1.不能有重复的元素.

2.元素不能为负数.

int GetMaxVal(int* arr, int len)
{
	int maxVal = arr[0];
	for (int i = 1; i < len; i++)
	{
		if (arr[i] > maxVal)
			maxVal = arr[i];
	}
	return maxVal;
}



void SimpleBucketSort(int* arr, int len)
{
	int tmpArrLen = GetMaxVal(arr, len) + 1;  //因为数组索引是从0开始,所以数组得是最大数加1
	int* tmpArr = new int[tmpArrLen];
	int i, j;
	for (i = 0; i < tmpArrLen; i++)
		tmpArr[i] = -1; //把临时数组的值全部赋予-1,如果赋予0的话待排序数组中有0值就不能排序了

	for (i = 0; i < len; i++)
		tmpArr[arr[i]]++;
	
	for (i = 0, j = 0; i < tmpArrLen; i++)
	{
		if (tmpArr[i] != -1)
		{
			arr[j] = tmpArr[i];
			j++;
		}
	}
}

 

 

对于第2点我们无能为力,但对于第一点可以改进下.

改进的桶排序

因为临时数组的索引就是待排序数组元素的值了,所以临时数组中可以不必再存储元素的值了.此时先把临时数组全部赋值为0,当有元素映射过来时就加1,有重复有元素就大于1

public static void BucketSort(int[] arr, int len, int max)
{
    int[] count = new int[max + 1];

    for (int i = 0; i < len; i++)
        count[arr[i]]++;

    for (int i = 0, j = 0; i < count.Length; i++)
    {
        while (count[i] != 0)
        {
            arr[j] = i;
            j++;
            count[i]--;
        }
    }  
}

 

 

分享到:
评论
1 楼 北极的。鱼 2015-05-01  
另一种简单桶排序实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int[] nums = new int[9] { 2, 1, 9, 2, 7, 3, 1, 8, 2 };//初始化一个数组,其中有9个数,每个数都不大于10,这里假定是我们输入的数,需要从小到大排序
            int[] a = new int[11];//因为每个数都不大于10,所以初始化一个包含11个数的数组a
            int i, j, t;
            for (i = 0; i <= 10; i++) a[i] = 0;//给a数组赋值都为0

            for (i = 0; i < nums.Length; i++)
            {
                t = nums[i];//获取当前的数
                a[t]++;//进行计数
            }
            for (i = 0; i <= 10; i++)//依次判断a[0]~a[10]
                for (j = 1; j <=a[i]; j++)//出现了几次就输出几次
                    Console.Write("  " + i);
        }
    }
}

缺点:

1.不适用于小数

2.当数值过多,太浪费空间,比如数值范围为0~99999,那需申请100000个变量,也就是要写成a[1000000]。

相关推荐

    桶排序_BUCKETSORT

    提供的`bucketSort.cc`文件可能包含一个桶排序的C++实现,通过阅读源代码,你可以深入理解桶排序的具体步骤和细节,包括映射函数的设计、桶的创建和数据的分布等。 桶排序是一种非常实用的排序算法,尤其在处理大...

    多趟桶式排序bucket sort

    多趟桶式排序bucket sort。数据输入:有10个数,范围为0到999。 [root@lumotuwe] gcc cas.c -o cas [root@lumotuwe] ./cas 64 8 216 512 27 729 0 1 343 125

    桶排序(Bucket Sort)

    桶排序算法是一种基于计数的排序算法,其基本思想是先扫描一遍待排序的序列,找出最大值和最小值,然后根据最大值和最小值确定桶的个数,并将每个元素分配到对应的桶中,最后将每个桶中的元素进行排序,然后依次输出...

    Bucket排序 MPI

    MPI bucket排序代码 用于mpi联系 熟悉bucket排序

    MPI.zip_MPI_bucket sort_mpi bucket sort_sort mpi_visual c

    在提供的文件名列表中,"bucketsort.c"和"BucketSort.cpp"可能是实现MPI桶排序的具体代码。其中,"bucketsort.c"可能使用C语言编写,而"BucketSort.cpp"则可能采用C++语言。这两个文件通常会包含以下部分: 1. **...

    排序算法-基于C语言实现的排序算法之BucketSort实现.zip

    在本主题中,我们将深入探讨一种特殊的排序算法——**BucketSort(桶排序)**,并将其与C语言的实现相结合。 **BucketSort**是一种分布式排序算法,其核心思想是将待排序的数据分布到若干个有序的“桶”中,每个桶...

    详解C++ 桶排序(BucketSort)

    C++桶排序是一种非比较型排序算法,它的工作原理是将一组元素分布到有限数量的“桶”里,每个桶再个别排序,最后按顺序连接所有桶得到有序序列。这种算法特别适合排序范围很广的集合。桶排序常用于将数据均匀分布在...

    AlgorithmMan by Iori(Bucket Sort)

    BucketSort为AlgorithmMan中的桶排序演示工具(这是可执行文件;需要.net 4.0支持;非源代码)。 原文:C#算法设计排序篇之10-桶排序(附带动画演示程序) 链接:...

    iOS桶排序算法

    桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。在iOS开发中,桶排序可以被用于优化大规模数据的排序过程...

    sort-使用C++实现的排序算法之BucketSort.zip

    C++实现的BucketSort涉及到的关键概念包括桶的创建、数据分布、桶内排序和结果合并。在实际编程时,需要灵活地调整桶的数量和大小,以适应不同类型的输入数据,同时选择合适的桶内排序算法,以达到最佳的排序效果。...

    桶排序 c++实现

    桶排序(Bucket Sort)是一种分布式排序算法,它将待排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。这个算法通常适用于数据分布均匀的情况,如果数据在一定...

    详解Bucket Sort桶排序算法及C++代码实现示例

    桶排序(Bucket Sort)是一种非比较型的排序算法,它基于分布排序的原理,通过将待排序的数据分到几个有序的桶里,每个桶再分别排序,最后将所有桶中的数据合并成一个有序序列。这种算法特别适用于数据分布均匀的...

    桶排序代码

    例如,提供的`BucketSort.docx`文件可能包含了桶排序的详细步骤、代码示例以及不同情况下的性能分析。通常,这样的文档会讲解如何创建和管理桶,如何选择合适的排序算法对桶内元素排序,以及如何优化桶排序的实现以...

    桶排序算法(C++版)

    桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分到几个有序的桶里,每个桶再分别排序,最后按照每个桶内元素的顺序依次取出,组合成整体的有序序列。这种算法适用于数据分布相对均匀的情况。下面...

    桶排序算法的实现与比较

    桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。桶排序算法的时间复杂度在最理想情况下可以达到线性的O(n...

    Bucket sort-binary search

    随机产生一定范围内的随机数,进行桶排序,然后二分查找任意个数的数。

    桶排序-解决排序问题

    桶排序(Bucket Sort)是一种分布式排序算法,常用于大数据处理和流式计算中。它将待排序的数据分布到多个“桶”中,每个桶再独立地进行排序,最后按照桶的顺序依次取出桶中的元素,形成有序序列。桶排序的核心思想...

    桶排序算法

    桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到多个“桶”中,每个桶再分别进行排序,最后将所有桶中的数据合并,得到全局有序的结果。桶排序算法基于分治策略,其核心思想是将待排序序列均匀...

    C语言桶排序

    桶排序(Bucket Sort)是一种分布式的排序算法,它将元素分布到多个“桶”中,然后对每个桶分别进行排序,最后再将所有桶中的元素合并成一个有序序列。桶排序的基本思想是假设输入数据服从均匀分布,通过将数据分到...

Global site tag (gtag.js) - Google Analytics