用队列模拟基数排序

    function Queue() {
        //用队列模拟基数排序对应的Queue构造函数中的方法一个都不能少,否则会出错
        this.dataStore = [];
        this.enqueue = enqueue;
        this.dequeue = dequeue;
        this.empty = empty;
    }
    function enqueue(element) {//向队尾添加一个元素
        this.dataStore.push(element);
    }
    function dequeue() {//删除队首的元素
        return this.dataStore.shift();
    }
    function empty() {//判断队列是否为空
        if (this.dataStore.length == 0) {
            return true;
        } else {
            return false;
        }
    }

    //模拟盒子的操作
    function distribute(nums, queues, n, digit) {//实际上queues就是模拟的盒子
        for ( var i = 0; i < n; ++i) {
            if (digit == 1) {
                queues[nums[i] % 10].enqueue(nums[i]);
                //因为queues的每一位都是盒子,因此它可以存储多个元素
            } else {
                queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
                //Math.floor(x):求小于等于x的最大整数
            }
        }
    }

    //将盒子中的数据存储到数组中,便于读取
    function collect(queues, nums) {
        var i = 0;
        for ( var digit = 0; digit < 10; ++digit) {
            while (!queues[digit].empty()) {
                //为什么要判断非空?因为每个元素盒子中可能包含多个子元素
                nums[i++] = queues[digit].dequeue();
            }
        }
    }

    function dispArray(arr) {//将一维数组输出
        for ( var i = 0; i < arr.length; ++i) {
            document.write(arr[i] + " ");
        }
    }
    // 主程序
    var queues = [];
    for ( var i = 0; i < 10; ++i) {
        queues[i] = new Queue();//queues的每个元素都是一个队列
    }
    var nums = [];
    for ( var i = 0; i < 10; ++i) {
        nums[i] = Math.floor(Math.random() * 101);
        //Math.random():返回0-1之间的随机数,这个数大于等于0,小于1
    }
    document.write("Before radix sort: " + "<br />");
    dispArray(nums);
    distribute(nums, queues, 10, 1);
    collect(queues, nums);
    distribute(nums, queues, 10, 10);
    collect(queues, nums);
    document.write("<br />" + "After radix sort: " + "<br />");
    dispArray(nums);
    /* 上述程序运行结果:
    Before radix sort: 
    76 36 33 65 72 48 45 45 61 80 
    After radix sort: 
    33 36 45 45 48 61 65 72 76 80 */

 关于原理:参考上篇:关于基数排序原理的理解

2016-04-10   18:47:32

posted @ 2016-04-10 18:48  绯乐  阅读(299)  评论(0编辑  收藏  举报