算法-基数排序

算法思想

  • 1.定义:基数排序按照对位数分组的顺序的不同,LSD(从低位开始)和MSD(从高位开始)基数排序.

Radix.jpg

  • 2.算法思路(LSD):
第一:定义长度十位数组(桶),存放排好序的数组;

第二:个位排序,个位大小对应桶编号,然后取出;

第三:十位排序,十位大小对应桶编号,然后取出;

第四:百位排序,百位大小对应桶编号,然后取出,0-1000的排序完成;


  • 3.例子:比较3 0 6 12 12 7 8 12 13 12 8 11 12 4

步骤一:以下个位排序,得到0 11 12 12 12 12 12 3 13 4 6 7 8 8

0号桶 [ 0 ]
1号桶 [ 11 ]
2号桶 [ 12, 12, 12, 12, 12 ]
3号桶 [ 3, 13 ]
4号桶 [ 4 ]
5号桶 [ ]
6号桶 [ 6 ]
7号桶 [ 7 ]
8号桶 [ 8, 8 ]
9号桶 [ ]

步骤二:将以上个位排序好的,然后进行十位排序,得到0 3 4 6 7 8 8 11 12 12 12 12 12 13

0号桶 [ 0, 3, 4, 6, 7, 8, 8 ]
1号桶 [ 11, 12, 12, 12, 12, 12, 13 ]
2号桶 [ ]
3号桶 [ ]
4号桶 [ ]
5号桶 [ ]
6号桶 [ ]
7号桶 [ ]
8号桶 [ ]
9号桶 [ ]

/*
 * @Author: yt.gan 
 * @Date: 2018-04-17 09:53:22 
 * @Last Modified by: yt.gan
 * @Last Modified time: 2018-04-17 10:57:14
 */

//基数排序
function CArray(elements) {
    this.dataStore = [];
    this.pos = 0;
    this.elements = elements;
    for (var i = 0; i < this.elements; ++i) {
        this.dataStore[i] = i;
    }
    this.setData = function() {
        //生成随机数
        //floor保留整数 random [0,1)
        for (var i = 0; i < this.elements; ++i) {
            this.dataStore[i] = Math.floor(Math.random() * (this.elements + 1));
        }
    }

    this.clear = function() {
        //清空数据
        for (var i = 0; i < this.dataStore.length; ++i) {
            this.dataStore[i] = 0;
        }
    }

    this.insert = function(element) {
        //插入数据
        this.dataStore[this.pos++] = element;
    }

    this.show = function() {
        //装换为字符串
        var reStr = '';
        for (var i = 0; i < this.dataStore.length; ++i) {
            reStr += this.dataStore[i] + " ";
            if (i > 0 & i % 10 == 0) {
                reStr += "\n";
            }
        }
        console.log(reStr);
    }

    this.swap = function(arr, index1, index2) {
        //交换位置
        var temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }

    this.radix = function(arr, maxBit) {
        //LSD 从低位开始进行排序
        //maxBit 元素的最高位数
        var mod = 10;
        var dev = 1;
        var temp = [];
        for (var i = 0; i < maxBit; i++, dev *= 10, mod *= 10) {
            //第一轮mod=10,dev=1 取个位
            //第二轮mod=100,dev=10 去十位
            for (var j = 0; j < arr.length; j++) {
                var bucket = parseInt((arr[j] % mod) / dev);
                if (temp[bucket] == null) {
                    temp[bucket] = [];
                }
                temp[bucket].push(arr[j]);
            }
            console.log(temp);
            var pos = 0;
            for (var j = 0; j < temp.length; j++) {
                var value = null;
                if (temp[j] != null) {
                    //从头开始取
                    while ((value = temp[j].shift()) != null) {
                        arr[pos++] = value;
                    }
                }
            }
        }
    }
}

var myNums = new CArray(14);
myNums.setData();
myNums.show();
myNums.radix(myNums.dataStore, 2);
myNums.show();

// 3 0 6 12 12 7 8 12 13 12 8 11 12 4

// [ [ 0 ],
//   [ 11 ],
//   [ 12, 12, 12, 12, 12 ],
//   [ 3, 13 ],
//   [ 4 ],
//   ,
//   [ 6 ],
//   [ 7 ],
//   [ 8, 8 ] ]

// [ [ 0, 3, 4, 6, 7, 8, 8 ],
//   [ 11, 12, 12, 12, 12, 12, 13 ],
//   [],
//   [],
//   [],
//   ,
//   [],
//   [],
//   [] ]

// 0 3 4 6 7 8 8 11 12 12 12 12 12 13

个人博客链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值