码迷,mamicode.com
首页 > 编程语言 > 详细

用队列模拟基数排序

时间:2016-04-10 19:27:24      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

    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

用队列模拟基数排序

标签:

原文地址:http://www.cnblogs.com/feile/p/5374883.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!