9、极简版桶排序

将5, 3, 5, 2, 8 从小到大排序

  1. 我们借助一个一维数组,申请一个大小为11的数组 a[11]。编号从a[0] ~ a[11] 。刚开始的时候,我们将 a[0] ~ a[10] 都初始化为0,。
  2. 开始处理每一个数值,第一个数值是5,我们就将相对应的 a[5] 的值在原来的基础上加1,即将 a[5] 的值从0改为1,表示数值5出现过了一次。
  3. 第二个数值是3,我们就把相对应 a[3] 的值在原来的基础上增加1,即将 a[3] 的值从0改为1,表示数值3出现过一次。
  4. 第三个数值也是5,所以 a[5] 的值需要在此基础上再增加1,即将 a[5] 的值从1改为2,表示数值5出现过了两次。
  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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值