您的位置:首页 > 其它

【排序算法】——桶排序

2016-07-24 16:41 295 查看

前提

    算法大讲堂开课了,连续几天的算法讲解,真是让小编收获颇多。之前小编尝试总结过冒泡排序,可是随着最近知识的增加,发现好像还有的理解偏颇之处,后续会继续完善。本次小编要讲解的是桶排序,个人认为桶排序是非常好玩的一个排序算法。最神奇的地方,不用交换数据,就能把数据的顺序调整好。

何为桶算法?

     首先实例化出n个桶,把待排序的数组里面的数在与之相等的桶的索引值,对应的桶里面的数据加1。工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到 O(n log n) 下限的影响。桶排序的时间复杂度是O(M+N)。

如何学习桶算法?

大概执行内容

1、产生随机数

2、创建对应的桶

3、桶和数据对应起来

4、相对应的桶数值加一

5、打印桶的索引值

代码展示

<span style="font-family:KaiTi_GB2312;font-size:24px;">  static void Main(string[] args)
{
SortHelper sorted = new SortHelper();
//待排序的数组
int[] arry = { 99, 65, 47, 47, 50, 88, 33, 66, 67, 31, 18 };
//调用桶排序的方法
sorted.BucketSort(arry, 99);
}
#region BucketSort封装桶排序的算法-贾文静-2016年7月20日21:27:30
public class SortHelper
{
public void BucketSort(int[] unsorted, int maxNumber)
{
//分配桶的个数,此排序范围和maxNumber的大小有关
int[] sorted = new int[maxNumber + 1];
//将待排序数组里面的数放到与sorted数组相对于的桶里面
//待排序的数等于桶排序的索引值,则对应的桶 sorted[unsorted[i]]数值加1
for (int i = 0; i < unsorted.Length; i++)
{
sorted[unsorted[i]] = sorted[unsorted[i]] + 1;
}
//打印出数值不为0的桶的索引值
for (int i = 0; i < sorted.Length; i++)
{
if (sorted[i] > 0)
{
//判断桶里面有多少个数,然后全部打印出来
for (int j = 0; j < sorted[i];j++ )
{
Console.WriteLine(i);
}
}
}
Console.ReadLine();
}
}
#endregion</span>


展示结果

         


代码程序之灵魂

    sorted[unsorted[i]] = sorted[unsorted[i]] + 1;

桶排序的优缺点

  桶排序的好处

1、桶排序是稳定的

2、大多数情况下桶排序是常见排序里最快的一种,比快排还要快

  桶排序的缺点

1、非常浪费存储空间

2、排序的数据非常限定,只能在整型范围之内

3、只能是整数。

总结

     桶排序是非常简单的一种排序方式,也是非常基础的一种。个人认为其中最厉害的就是不交换位置就能排好顺序。索引值和待测数值联合起来,真心觉得想法还是非常重要!这才是真正的创造。当然桶排序有很大的不足之处,排序的范围很受限制,所以更要此基础上学习新的算法,以此来提高自己!而且发现虽然理解原理,但是真正写出运行的程序还是对自己有难度的,积累吧,提高代码量!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: