标签:
今天开始了对《啊哈算法》这本书的学习。概括来讲,这本书算是算法界的小白书,语言很通俗,介绍的算法也比较简单,现在回来看简单的东西会不会显得浪费时间呢?不然,笔者最近感觉竞赛并不是终极之道,学习的方向也改为以书为对象(《具体数学》一栏的设立便可以看出),开始慢慢完善专业知识的体系,并慢慢做一些实用性的东西。
对于排序问题,是算法需要解决的基本问题,而排序也有很多种,其不同的方法也决定了其不同的效率,下面我们来看几种常见的排序方法。
桶排序:
给出一组样例:将5、8、3、1、7从小到大的排序。
桶排序基于一维数组,给出这样排序方法:初始化数组a[10] = 0,然后a[5]++、a[8]++、a[3]++、a[1]++、a[7]++。随后我们控制循环语句,访问a[i],并将i输出a[i]次,最终我们便会得到由小到大的排列。而这个过程,也像其名字所描述的,将数据i扔到了下标为i的数组元素a[i]这个桶里。
桶排序巧妙的把数i当做一维数组的下标,而用a[i]记录i出现的次数,利用下标自小到大的排列顺序完成了对数据的排列。其优点是简易明了,但是缺点也很明显,我们所开的数组长度是受内存空间限制的,因此随着数据的扩大,该排序便显得捉襟见肘了。
下面我们来简单的实现一下这个桶排序。
#include<cstdio> int main() { int a[11] , i , j , t; for(i = 0;i <= 10;i++) a[i] = 0; for(i = 1;i <= 5;i++) { scanf("%d",&t); a[t]++; } for(i = 0;i <= 10;i++) for(j = 1;j <= a[i];j++) printf("%d ",i); return 0; }
标签:
原文地址:http://www.cnblogs.com/rhythmic/p/5440732.html