《啊哈!算法》JavaScript实现笔记(持续更新...)

1.排序

1.1 桶排序

题:

JS代码:

var score=[5,5,2,8,3];
var arr=new Array(11);

for(var i=0;i<arr.length;i++){
    arr[i]=0;//初始化原数组为全0
}

for(var j=0;j<score.length;j++){
    var t=score[j];//将成绩数组里面的值依次赋给t
    arr[t]++;//再把这个成绩出现在arr数组中下标的值++
}

for(var i=1;i<=10;i++){ //外层循环arr数组的10个值
    for(var j=0;j<arr[i];j++){ //内层循环输出有出现过的数据的下标
        console.log(i)
    }
}

结果:

image-20210910105843869

题目的要求需要输出为降序,只需修改部分代码:

// 降序
for(var i=10;i>=0;i--){ //外层循环arr数组的10个值
    for(var j=0;j<arr[i];j++){ //内层循环输出有出现过的数据的下标
        console.log(i)
    }

image-20210910113637719

image-20210910110204150

算法拓展:

image-20210910110337382

代码:

输入你需要随机生成几个数据:<input type="text" placeholder="请输入整数"><br>
var n;
var book=new Array(1001);
var list=[];
var input =document.querySelector('input');

input.onblur=function(){
    n=parseInt(input.value);//得到需要随机生成几个整数

    for(var i=0;i<n;i++){
        var num=Math.floor(Math.random()*1000);
        list.push(num);//将随机生成的数追加到数组list里面
    }
    console.log(list)

    for(var i=0;i<book.length;i++){
        book[i]=0;//初始化原数组为全0
    }

    for(var i=0;i<list.length;i++){
        var t=list[i];//将随机生成的数依次赋值给t
        book[t]++;//记录book数组中下标为t的数出现的次数
    }

    for(var i=1;i<=1000;i++){
        for(var j=0;j<book[i];j++){
            console.log(i)
        }
    }
}

结果:

image-20210910113349086

降序为:

// 降序
for(var i=1000;i>=0;i--){
    for(var j=0;j<book[i];j++){
        console.log(i)
    }
}

image-20210910113822193

1.2 冒泡排序

根据书中的描述我写出的代码:

var arr=[11,25,62,22,14]
for(var i=0;i<arr.length-1;i++){//需要比较的次数
    for(var j=0;j<arr.length-i;j++){//依次比较
        if(arr[j]<arr[j+1]){//这里的大于小于控制升序和降序
            var t=arr[j]
            arr[j]=arr[j+1]
            arr[j+1]=t
        }
    }
}
console.log(arr)

image-20210917092834180

改写成n个数据:

输入你需要随机生成几个数据:<input type="text" placeholder="请输入整数"><br>
var input=document.getElementsByTagName('input');
var n
var arr=[]
input[0].onblur=function(){
    n=this.value//随机生成多少个数据
    for(var i=0;i<n;i++){
        var number=Math.floor(Math.random()*1000)
        arr.push(number)
    }
    console.log(arr)//输出随机生成的数据数组

    for(var i=0;i<arr.length-1;i++){//需要比较的次数
        for(var j=0;j<arr.length-i;j++){//依次比较
            if(arr[j]<arr[j+1]){//这里的大于小于控制升序和降序
                var t=arr[j]
                arr[j]=arr[j+1]
                arr[j+1]=t
            }
        }
    }
    console.log(arr)
}

结果:

image-20210917100046188

对1.1的成绩排序优化:输出成绩从高到低的姓名

//模拟数据
var obj=[
    {
        name:'胡桃',
        score:60
    },
    {
        name:'甘雨',
        score:98
    },
    {
        name:'雷军',
        score:71
    },
    {
        name:'七七',
        score:77
    },
    {
        name:'迪卢克',
        score:48
    },
    {
        name:'凯亚',
        score:56
    },    
]

for(var i=0;i<obj.length-1;i++){//需要比较的次数
    for(var j=0;j<obj.length-i-1;j++){//依次比较
        // console.log(j+':'+obj[j+1].score)
        if(obj[j].score<obj[j+1].score){//obj[j+1].score有个小bug,需要在前面多减一个1
            var t=obj[j]
            obj[j]=obj[j+1]
            obj[j+1]=t
        }
    }
}
//遍历输出名字
console.log(obj)
for(var i=0;i<obj.length;i++){
    console.log(obj[i].name)
}

image-20210917112928339

image-20210917113252048

1.3 快速排序

这个部分的漫画解析生动形象,便于代码理解,建议看原书

function quicksort(left,right){
    if(left>right){
        return;//判断传入的参数是否有问题
    }

    var temp=arr[left]//temp存入基准值
    var i=left
    var j=right

    while(i!=j){
        //先从右往左找
        while(arr[j]>=temp && i<j){
            j--;
        }
        //再从左往右找
        while(arr[i]<=temp && i<j){
            i++;
        }

        //交换两个数在数组中的位置
        if(i<j)//当哨兵i和哨兵j没有相遇时
        {
            var t=arr[i];
            arr[i]=arr[j];
            arr[j]=t;
        }

    }

    //*****将基准数归位
    arr[left]=arr[i];
    arr[i]=temp;

    console.log(arr)//输出查看每次排序后的结果
    quicksort(left,i-1);//继续处理左边的,递归调用
    quicksort(i+1,right);//继续处理右边的,递归调用
}

//测试
var arr=[2,1,5,4,6,3,8,9,7,10] 
quicksort(0,9)
console.log('快速排序结果:'+arr)

image-20210917153736964

image-20210917153849401

1.4 小哼买书

image-20210917160002518

2.栈、队列、链表

2.1 队列

image-20210929091101903

image-20210929091221434

var arr=new Array(30)
arr.unshift(6,3,1,7,5,8,9,2,4)
var newArr=[]
//初始化队列
var head=0;
var tail=9;

while(head<tail){//队列补位空的时候执行

    //将每一次删除的存入新数组
    newArr.push(arr[head])
    //队首出队
    head++;

    //将新的队首添加到队尾
    arr[tail]=arr[head];
    tail++

    head++
}
console.log(arr)
//小哈qq号
console.log(newArr)

image-20210929092747499

2.2 栈

image-20211008202306583

回文字符的判断

//判断是否为回文字符
var str='aahhaa';
var res=judge(str);
console.log(res)

function judge(str){
    //定义一个空栈数组
    var a=[]

    //初始化栈顶
    var top=0;

    //定义比较的下标
    var next;

    //得到字符串的中间点的下标
    var mid=Math.floor(str.length/2-1);

    //将中间下标之前的字符入栈
    for(var i=0;i<=mid;i++){
        a[top++]=str[i]
    }

    //判断字符串长度为奇数还是偶数,得到开始比较的下标
    if(str.length%2==0){
        next=mid+1
    }else{
        next=mid+2
    }

    //开始匹配
    for(var i=next;i<str.length;i++){
        if(str[i]!=a[top-1]){
            break;
        }
        top--
    }

    //如果是回文字符串,那么top的值就会变为0,因为每个字符都被匹配到了
    if(top==0){
        return 'Yes!'
    }else{
        return 'No!'
    }
}

image-20211008202233902

2.3 纸牌游戏——小猫钓鱼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值