使用队列对数组排列,基数排序

使用队列对数组排列,基数排序
/*
* 使用队列对数组排列,基数排序
*对于0~99的数字,基数排序将数组集扫描两次。
* 第一次按个位上的数字进行排序,
* 第二次按十位上的数字进行排序
* */
function Queue(){
    this.dataStore = [];//存放队列的数组,初始化为空
    this.enqueue = enqueue;//向队列尾部添加一个元素
    this.dequeue = dequeue;//删除队首的元素
    this.theFront = theFront;//读取队首的元素
    this.back = back;//对取队尾的元素
    this.toStrings = toStrings;//显示队列内的所有元素
    this.empty = empty;//判断队列是否为空
}

function enqueue(element){
    this.dataStore.push(element);
}

function dequeue(){
    return this.dataStore.shift();
}

function theFront(){
    return this.dataStore[0];
}

function back(){
    return this.dataStore[this.dataStore.length-1];
}

function toStrings(){
    return this.dataStore;
}

function empty(){
    if(this.dataStore.length == 0){
       return true;
    }else{
        return false;
    }
}
/*基数排序
* nums :需要排序的数组
* queues :数组,里面元素是队列
* n :队列的格式,这里为10个
* digit :传入1,则先按个位上的数字排序;传入10,则按十位上的数字排序
 *  */
function distribute(nums,queues,n,digit){
    for(var i = 0;i < n;i++){
        if(digit == 1){
            queues[nums[i]%10].enqueue(nums[i]);
        }else if(digit == 10){
            queues[Math.floor(nums[i]/10)].enqueue(nums[i]);
        }else{

        }
    }
}

function collect(queues,nums){
    var i = 0;
    for(var j = 0;j < 10;j++){
        while(!queues[j].empty()){
            nums[i++] = queues[j].dequeue();
        }
    }
}

/*测试程序*/
var queues = [];
for(var i = 0;i < 10;i++){
    queues[i] = new Queue();
}
var nums = [];
for(var i = 0;i < 10;i++){
    nums[i] = Math.floor(Math.random()*101);
}
console.log("开始的nums: "+nums);//24,72,90,84,49,69,8,30,50,0
distribute(nums,queues,10,1);
collect(queues,nums);
distribute(nums,queues,10,10);
collect(queues,nums);
console.log("排序后的nums: "+nums);//0,8,24,30,49,50,69,72,84,90
时间: 2024-11-06 09:56:31

使用队列对数组排列,基数排序的相关文章

队列(数组模拟)

//队列(数组模拟) class Queue{ private int[] queue; //队列函数 int length; int head; //头指针 int tail; //尾指针 int num; //丢列中元素个数 public Queue(){ } public Queue(int s){ //构造队列函数 length=s; queue=new int[length]; //s为队列长度 head=0; tail=-1; num=0; } public void inQueue

数据存储的常用结构 堆栈、队列、数组、链表

数据存储的常用结构有:堆栈.队列.数组.链表.我们分别来了解一下: 堆栈,采用该结构的集合,对元素的存取有如下的特点: 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素).例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹. 栈的入口.出口的都是栈的顶端位置 压栈:就是存元素.即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置. 弹栈:就是取元素.即,把栈的顶端位置元素取出,栈中已有元素依次

队列的数组实现

#include <stdio.h> #define maxn 1000 //队列ADT---数组实现 struct queueRecord; typedef struct queueRecord *Queue; typedef int elementType; int isEmpty(Queue Q); int isFull(Queue Q); Queue creatQueue(int maxn); void disposeQueue(Queue Q); void makeEmpty(Que

队列的数组和链表实现

队列的单链表实现 queue.h #ifndef QUEUE_H_ #define QUEUE_H_ typedef int ElementType; #ifndef _QUEUE_LIST_ #define _QUEUE_LIST_ struct QNode; typedef struct QNode * QNodePtr; struct QNode { ElementType Element; QNodePtr Next; }QNode; typedef struct Node { QNod

队列(一)——队列的数组实现方式

1.队列的概念 队列是一种特殊的线性表,仅仅同意在队列的一端进行插入而在还有一端进行删除. 队列一般拥有队首(front指针)和队尾(rear指针).当一个队列并未存入数据的时候,front和rear指针均指向队首. 入队的操作:rear后移,存入数据在rear指向的单元,队满不可入队,这同一时候也表明front总是指向队首元素的前驱. 出队的操作:front后移,元素出队,队空不可出队. 注意:在这样的队列的实现方式下.浪费了一个单元,可是这样能够保证队满和队空是不同的条件来推断. 2.队列空

求数组排列的范围

问题描述:给定一个整数数组,将这个整数数组排列成一个整数,并且数组的每个元素都要用到,求所排列出的整数的范围. 分析:这是一个很有意思的题目,初看好像是要求所有排列情况的最小值和最大值,当然这样做也可以求出来,只不过时间复杂度过高, 另外还有一个问题是大数问题,所排列成的数可能范围很大,超过了基本数据类型所能表示的范围,因此需要转换为字符串处理. 下面详细介绍解法: 解法一:用排列法.也就是求出这个数组的全排列,然后求出这个排列的最小值和最大值.由于排列要用到递归实现, 递归一般消耗系统大量的时

算法导论10:栈链表的简化、队列的数组实现 2016.1.10

新年的前十天做了比较有意义的事情就是坚持每天写博客,明天就开始期末考试了,所以等假期再继续学习. 把昨天提到的S.bottom简化之后又改了栈的链表.代码如下(已折叠): #include<stdio.h> #include<stdlib.h> typedef struct _node{ int num; struct _node *next; }node; node *s; void build(node *&S) { s=(node *)malloc(sizeof(no

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

后缀数组(基数排序)的具体分析

我看后缀数组,思想很容易懂,但是基数排序那边我确实理解了很久才理解,现在我写一份自己可以看懂的具体分析. 第一步,首先将所有的位置上的值装入数组中,并记录排名为i的数为sa[i],第i个数的排名为rank[i]. 下面就要进行logn次的倍增操作,我们定义k为当前倍增长度 基数排序,痛苦ing 首先将每一对数的排名存到cur数组,cur[i][0]记录初始位置的排名,cur[i][1]为i+k位置上的排名 首先我们对第二关键字也就是cur[i][1]进行排名,用sa数组记录排名为i的在第几个 接