将5, 3, 5, 2, 8 从小到大排序
- 我们借助一个一维数组,申请一个大小为11的数组 a[11]。编号从a[0] ~ a[11] 。刚开始的时候,我们将 a[0] ~ a[10] 都初始化为0,。
- 开始处理每一个数值,第一个数值是5,我们就将相对应的 a[5] 的值在原来的基础上加1,即将 a[5] 的值从0改为1,表示数值5出现过了一次。
- 第二个数值是3,我们就把相对应 a[3] 的值在原来的基础上增加1,即将 a[3] 的值从0改为1,表示数值3出现过一次。
- 第三个数值也是5,所以 a[5] 的值需要在此基础上再增加1,即将 a[5] 的值从1改为2,表示数值5出现过了两次。
- 按照以上的方法处理剩下的数据,最终结果就如下图所示:
我们发现,a[0] 到 a[10] 中的值其实就是0到10的数值出现的次数。接下来,我们只需将出现过的数值打印出来就可以了,出现过几次就打印几次,具体如下:
a[0] 为0, 表示数值“0”没有出现过,不打印。
a[1] 为0, 表示数值“1”没有出现过,不打印。
a[2] 为1, 表示数值“2”出现过1次,打印2。
a[3] 为1, 表示数值“3”出现过1次,打印3。
a[4] 为0, 表示数值“4”没有出现过,不打印。
a[5] 为2, 表示数值“5”出现过2次,打印5 5。
a[6] 为0, 表示数值“6”没有出现过,不打印。
a[7] 为0, 表示数值“7”没有出现过,不打印。
a[8] 为1, 表示数值“8”出现过1次,打印8。
a[9] 为0, 表示数值“9”没有出现过,不打印。
a[10] 为0, 表示数值“10”没有出现过,不打印。
最终我们得到输出结果:2 3 5 5 8
到此就实现了从小到大的排序。
这个算法就好比有11个桶,编号从0 ~ 10。每出现一个数,就在对应编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子即可。
如果需要对数据范围在 0 ~ 1000 之间的整数进行排序,我们需要1001个桶,此处每一个桶的作用就是“标记”每个数出现的次数。由此我们会发现,此简单的桶排序算法只适用于小型数据的排序,对于大型数据的排序,则浪费空间,效率会越来越低。
var orignArr = [5, 4, 1, 3, 8, 2];
var resultArr = [];
//简单桶排序方法如下
var tongFunc = function(orignArr) {
//对于10以内的数据排序,需要11个桶,定义桶数组, 并赋值为0
var tempArr = [];
for(var i=0; i<11; ++i) {
tempArr[i] = 0;
}
//循环待排序数据,每出现一个数,就把对应索引的桶的值加一
for(var i=0; i<orignArr.length; ++i) {
++tempArr[orignArr[i]];
}
// 循环桶数组,如果桶索引对应的值不为0,则输出该索引
for(var i=0; i<tempArr.length; ++i) {
if(tempArr[i] !== 0) {
for(var j=0; j<tempArr[i]; ++j) {
resultArr.push(i)
}
}
}
console.log(resultArr);
}
tongFunc(orignArr);