1.概述

桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响,速度是比较快的。

步骤:

  1. 设置一个定量的阵列当作空桶子。
  2. 寻访序列,并且把项目一个一个放到对应的桶子去。
  3. 对每个不是空的桶子进行排序。
  4. 从不是空的桶子里把项目再放回原来的序列中。

 

理解:

例如待排数字   [6 2 4 1 5 9],准备10个空桶,最大数个空桶

[6 2 4 1 5 9]           待排数组

[0 0 0 0 0 0 0 0 0 0]   空桶

[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

1. 顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶,这个过程类似这样:空桶[ 待排数组[ 0 ] ] = 待排数组[ 0 ]

[6 2 4 1 5 9]           待排数组
[0 0 0 0 0 0 6 0 0 0]   空桶
[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

2. 顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶

[6 2 4 1 5 9]           待排数组
[0 0 2 0 0 0 6 0 0 0]   空桶
[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

3.  剩余元素过程一样,全部入桶后变成下边这样

[6 2 4 1 5 9]           待排数组
[0 1 2 0 4 5 6 0 0 9]   空桶
[0 1 2 3 4 5 6 7 8 9]   桶编号(实际不存在)

4. 0表示空桶,跳过,顺序取出即可:1 2 4 5 6 9

2.示例

 

        //C# Code
        //桶排序
        public static void BucketSort(int[] nums)
        {
            int maxVal = nums[0];
            for (int maxIndex = 1; maxIndex < nums.Length; maxIndex++)
            {
                if (nums[maxIndex] > maxVal)
                    maxVal = nums[maxIndex];
            }

            int tmpArrLen = maxVal + 1;
            int[] tmpArr = new int[tmpArrLen];
            int i, j;

            for (i = 0; i < nums.Length; i++)
                tmpArr[nums[i]]++;
            for (i = 0, j = 0; i < tmpArrLen; i++)
            {
                while (tmpArr[i] != 0)
                {
                    nums[j] = i;
                    j++;
                    tmpArr[i]--;
                }
            }
        }
         //   int[] list = new[] { 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 };
         //   Sorter.BucketSort(list);

 

 

 

 

posted on 2013-03-04 10:30  Qlin  阅读(606)  评论(1编辑  收藏  举报