学习Js-day05

今天的主要内容为数组和排序😄

数组我们首先想到数据结构中,数据的结构,逻辑结构,存储结构和算法,存储结构分为线性结构(数组,队列,栈,堆,链表)和非线性结构(树,图,hash(散列表)),其中只要能存储数据的结构,就一定具有增删检查的方法,将数据存放在一起,我们就使用了数组。🥰

数组:固定一类数据的组合(一般情况下我们数组里面的数据类型一致(包含多个数据))

    数组的声明(引用数据类型):

    1.使用[]声明数组,以 ,分隔
    2.使用new 关键词进行声明(对象)
    var arr = new Array(10) 里面的参数指定对应的长度,如果没写,表示长度为0
    3.length属性来访问对应的长度
var arr = [1,2,3]//第一种声明
    console.log(arr); //3 [1,2,3]
    var arr1 = new Array(10)//10个空间 第二种声明
    console.log(arr1[0])//undefined
    //通过length来访问数组的长度
    console.log(arr.length);//3
    // 通过下标来访问对应数组的元素
    // 数组遍历操作
    // 数组的核心,其实就是一个顺序表,对应依赖下标来实现
    for(var i = 0;i<arr.length;i++){
        console.log(arr[i]);
    }
<script>
    var arr = [1,2,3]//第一种声明
    console.log(arr); //3 [1,2,3]
    var arr1 = new Array(10)//10个空间 第二种声明
    var arr2 = new Array(1,2,3,4); //当前数组里有1,2,3,4,
    console.log(arr1[0])//undefined
    console.log(arr2.length);//4
    console.log(arr.length);//3
    for(var i = 0;i<arr.length;i++){
        console.log(arr[i]);
    }
    console.log(arr['0']);//1 可以允许字符串
    console.log(arr[0]);//1

    arr[0] = 10;
    console.log(arr[0]);//给数组赋值
</script>

数组的方法:增删插减

<script>
    // 栈方法 :将内容追加到最后面
    // push方法(添加到最后一个)
    var arr = [1]
    arr.push(10)
    console.log(arr); //[1, 10]

    // 队列方法:先进先出 将内容追加到最前面
    // unshift方法 (添加到第一个
    var arr = [1]
    arr.unshift(10)
    console.log(arr); //[10, 1]

    // 删除 delete(不可还原 remove(可还原
    // 栈方法 pop方法 删最后面一个
    var arr = [1,2,3]
    arr.pop()
    console.log(arr); // [1, 2]

    // 队列方法 shift方法 删第一个
    var arr = [1,2,3]
    arr.shift()
    console.log(arr); // [2, 3]

    // 修改 replace替换 update更新
    // 反转reverse将最后一个变到第一个
    var arr = [1,2,3,4,8]
    arr.reverse()//返回一个数组 反转后的数组
    //console.log(arr.reverse()); //[8, 4, 3, 2, 1]
    console.log(arr);  //[8, 4, 3, 2, 1]

    /* var arr1=arr.reverse();
    arr1.unshift(10);
    console.log(arr); */
    
    // 排序sort 默认情况下根据首字母的ASCII码排序,先比第一个再比第二个
    var arr = [1,2,5,3,4,5]
    arr.sort() //返回一个排列好的数组
    // console.log(arr.sort());
    console.log(arr);

    // sort 其实是一个高阶函数 高阶函数就是一个函数作为参数的函数
    var arr3 = [15,20,11,4,5]
    arr3.sort(function(a,b){
        // 1 和 -1 来进行大小区分和排序规则
        // return a-b 正序
        // return b-a 倒序
    })
    console.log(arr3);

</script>

<script>
    // 栈方法
    var arr = [1,2,3]
    arr.push(10)
    console.log(arr.push(10));
    console.log(arr); //[1, 2, 3, 10]
    arr.pop()
    console.log(arr.pop());
    console.log(arr); //[1, 2, 3] 对应的返回值就是被删的那个值
</script>
<script>
    var arr = [4,5,6]
    console.log(arr.unshift(10));
    console.log(arr);
    console.log(arr.shift());
    console.log(arr);
</script>
<script>
    // concat连接
    // slice截取
</script>
<script>
    // 不会影响原本数组的方法 返回新的数组
        var arr =[1,2,3,4];
        var arr1 =[1,2,3,4];
        var arr2 =[1,2,3,4];
    // concat 连接 把多个数组变成一个数组 返回  扩展运算符 打开数组取出里面的值
        var newArr = arr.concat(arr1,arr2)
        console.log(newArr);
    // slice 切片 把一个数组里面的东西提出 返回新的数组
    var sliceArr = arr.slice()//全切出
    console.log(sliceArr);
    var sliceArr1 = arr.slice(0)//从0开始切到最后 下标不存在就会返回空数组 例如4
    console.log(sliceArr1);
    var sliceArr2 = arr.slice(0,1)//不包含结束的下标 包含开始的下标
    console.log(sliceArr2);
    // concat方法slice方法返回的数组跟原本的数组不是一个对象,但是里面的值或者对象的地址是一样的
    var obj ={name:'jack'}
    var objArr = [obj]
    var objArr1 = objArr.concat()
    var objArr2 = objArr.slice()
    console.log(objArr[0].name);//jack
    objArr1[0].name = 'tom' //给name赋值
    console.log(objArr2[0].name);//tom
    console.log(objArr[0].name);//tom
</script>

<script>
    // splice会影响之前的数组 删除,截取,插入
    var arr = [12,13,45]
    // 参数 开始位置 删除的个数(可以不写 默认就是数组的length
    // var newArr = arr.splice(0) //从第一个开始删
    // console.log(newArr);
    // console.log(arr);
    var newArr = arr.splice(1,2)
    console.log(newArr);//[13, 45] 删除的内容
    console.log(arr);//[12] 删除后的结果
</script>

数组方法的练习:

<script>
    // 求数组中元素的和
    var arr = [1, 2, 3, 5]
    var sum = 0
    for (var value of arr) {
        sum += value
    }
    console.log(sum);

    // 交换位置
    function reve(arr){
        for (var i = 0; i < arr.length/2; i++) {
            var temp = arr[i]//接收原本的值
            arr[i] = arr[arr.length-1-i]//将原本的位置的值用替换位置的值替换
            arr[arr.length-1-i] = temp//将替换位置变成原本的值
        }
    }
     console.log(arr);

    //  求最大数
    function maxNumber(arr){
        var max = arr[0]
        for(var i=1;i<arr.length;i++){
            if(arr[i]>max){
                max = arr[i]
            }
        }
        return max;
    }
    console.log(minNumber(arr));

    // 求最小数
    function minNumber(arr){
        var min = arr[0]
        for(var i=1;i<arr.length;i++){
            if(arr[i]<min){
                min = arr[i]
            }
        }
        return min;
    }
    console.log(minNumber(arr));

    // 求最小数的下标
    var arr = [1,2,34,58,9,5]
    function minNumberIndex(arr){
        var minIndex = 0
        for(var i=1;i<arr.length;i++){
            if(arr[i]<arr[minIndex]){
                minIndex = i
            }
        }
        return minIndex
    }
    console.log(minNumberIndex(arr));
</script>

排序算法!!!

常见的排序:

冒泡排序 基础排序
选择排序 选择最大值或者最小值进行比较的排序
快速排序 在数据量不多(低于十万内)最快的 冒泡排序的进阶
希尔排序 插入排序的进阶
插入排序 插入数据的时候进行排序
归并排序 大数据排序的常用排序算法
<script>
    // 冒泡排序
    //两个for循环嵌套 第一个循环次数 相当于length-1 第二个每趟比较是递减
    // 相邻的两个相比 j和j+1相比
    function bubble(arr){
        // 遍历数组
        for(var i = 1;i<arr.length;i++){
            // 判断对应没有比较的值
            for(var j=0;j<=arr.length-i;j++){
                // 相邻的两两比较
                if(arr[j]>arr[j+1]){
                    // 换位置
                    var temp = arr[j];
                    arr[j] = arr[j+1]
                    arr[j+1] = temp
                }
            }
        }
        return arr
    }
    var arr = [12,4,3,7,5,8,2]
    console.log(bubble(arr));
</script>

<script>
    // 选择排序
    function select(arr){
        // 遍历数组
        for(var i = 0;i<arr.length;i++){
            var min = i;//记录最小下标 默认当前的i
            for(var j=i+1;j<arr.length;j++){//遍历后面的内容
                if(arr[j]<arr[min]){
                    // 记录这个下标
                    min = j;
                }
            }
            // 判断当前最小下标是否为开始的默认下标,不是就换位置
            if(min!=i){
                // 换位置
                var temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp
            }
        }
        return arr;
    }
    var arr = [12,8,9,3,5,2,7];
    console.log(select(arr));
</script>

<script>
    // 快速排序
    function quick(arr){
        if((arr.length<=1)){
            return arr;
        }
        // 定义左边数组,右边数组 以及中间值 基数 
        var left = [],right = [] ,mid=arr[0]
        // 遍历数组
        for(var i = 1;i<arr.length;i++){
            arr[i]>mid?right.push(arr[i]):left.push(arr[i])
        }
        return quick(left).concat([mid],quick(right))
    }
    var arr = [12,8,9,3,5,2,7];
    console.log(quick(arr));
</script>

课前预习

<script>
    var arr = [2, 3, 4, '绿箭侠', '黑寡妇'];
    var arr2 = arr.splice(2, 1); //第一个参数代表我要开始截取的下标位置
    //第二个参数截取的长度, 如果只有两个参数, 则表示删除操作
    console.log(arr); //[2, 3, '绿箭侠', '黑寡妇'];    4
    console.log(arr2); //4   1
</script>
<script>
    // concat() : 追加数据, 创建一个新数组, 不改变原数组
    var arr = [2, 3, 4, '绿箭侠', '黑寡妇'];
    var arr2 = arr.concat('美队', '雷神');
    console.log(arr); //5
    console.log(arr2); //7

    // slice() :  不修改原数组, 将原数组中的指定区域数据提取出来
    var arr = [2, 3, 4, "绿巨人"];
    var arr2 = arr.slice(1, 3); //并没有修改原数组,将原数组中的元素提取出来,生成新数组, 取的是下标在区域: [1,3)
    console.log(arr); //4
    console.log(arr2); //2 [3,4]
</script>
<script>
    var colors = new Array("red", "blue", "green");
    colors.length = 2;
    console.log(colors[2]);//undefined
</script>
<script>
    var arr = [2, 3, 4, '绿箭侠', '黑寡妇'];
      var arr2 = arr.concat('美队', '雷神');
      console.log(arr);
      console.log(arr2); 

</script>
1.<script>
    var arr = [3,2,4,5,8,6,3,9];
    var arr2 = arr.slice(3,6);
    console.log(arr);
    console.log(arr2);  //[5, 8, 6]
</script>
2.<script>
    var arr = [1,2,3,4,6,7,8];
    arr.splice(4,0,5) 
    console.log(arr);
</script>

3.<script>
    var arr = ["我","是","一","只","笨","鸟"];
    arr.splice(4,1,'聪','明')
    console.log(arr);
</script>

😁敲一天,敲得我膀子都是栓的😡

posted @ 2022-07-29 19:36  可爱就要得到  阅读(25)  评论(0)    收藏  举报