随手笔记06-有关数组的算法和方法

数组定义

数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式。
数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式。
引用类型:存储分两部分,在堆中保存数据,在栈中保存地址

typeof 经常用来检测基本数据类型 检测引用类型时,结果object
若想精确判断应用类型,instanceof 返回的是一个布尔型

var arr=[];
console.log(typeof arr);//object
console.log(arr instanceof Array);//true 

数组的一些方法

方法描述
push ()向数组末尾添加元素 (可以一次性添加多个元素)
pop()删除数组末尾元素
shift()删除数组中的第一个元素
unshift()在数组头部插入元素(可以一次性增加多个元素)
splice()用于插入、删除或替换数组的元素
sort()默认按照ASCII码进行排序(可自定义排序)
reverse()数组倒序
concat ()合并数组 (拼接数组可多参)
slice()分割数组
IndexOf()判断元素在数组中的位置,找不到返回-1
join()按照指定字符将数组元素拼接为字符串

数组新方法

注意:迭代方法IE8之下不支持
迭代方法,这些方法都可以实现数组的遍历

方法描述
forEach()接收一个函数作为参数(函数有三个参数,分别是:item/index/arr) 遍历数组
every()返回布尔型 若每一个元素都满足条件返回true
some()返回布尔型 若有一个元素满足条件就返回true
filter()返回新数组 把满足条件的元素过滤出来存放到新数组里
map()返回新数组 将所有元素根据规则统一生成一个新数据放到数组里

排序算法

  • 选择排序法

当前元素分别和后面所有的元素作比较,发现小的,交换位置

var arr = [4, 3, 2, 1, 5, 6, 7, 9, 8, 0];
        //外层控制循环趟数
        for (var i = 0; i < arr.length; i++) {
            var temp = arr[i];
            //内层控制每一趟走的次数
            for (var j = i + 1; j < arr.length; j++) {
                //如果发现更小的的数,进行交换 
                if (temp > arr[j]) {
                    arr[i] = arr[j];
                    arr[j] = temp;
                    temp = arr[i];
                }
            }
        }
        console.log(arr);
        //----------控制台输出------------
        //(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 冒泡排序法

相邻元素作比较,交换位置(大的放后面)

 // 冒泡法:相邻元素作比较,交换位置(小的在前面)
        var arr1 = [4, 3, 2, 1, 5, 6, 7, 9, 8, 0];

        //外层控制多少趟
        for (var i = 0; i < arr1.length; i++) {
            //内层控制每趟走多少次,每趟次数减少1(内层循环次数减少1)
            for (var j = 0; j < arr1.length - i; j++) {
                if (arr1[j] > arr1[j + 1]) {
                    var temp = arr1[j];
                    arr1[j] = arr1[j + 1];
                    arr1[j + 1] = temp;
                }
            }
        }
        console.log(arr1);
        //----------控制台输出------------
        //(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 快速排序法

一、先选择一个基准数,数组中的其它数据分别和这个基准数进行比较,
二、将小于基准数的数字放入一个数组中,将大于基准数的数字放入另一个数组中
三、重复这个过程 (利用递归函数重复)

 // 快速排序:算法比较快   又被称为:分治法 或 冒泡排序增强版

        //     一、先选择一个基准数,数组中的其它数据分别和这个基准数进行比较,
        //     二、将小于基准数的数字放入一个数组中,将大于基准数的数字放入另一个数组中
        //     三、重复这个过程
        var arr = [3, 4, 1, 2, 5, 43, 123, 4, 42, 6];
        // 递归函数
        function fn(arr) {
            // 函数的终止条件
            if (arr.length <= 1) {
                return arr;
            }
            // 获取基数的索引   
            var index = Math.floor(arr.length / 2);
            //保存基数	arr.splice(index, 1)返回的是一个数组,取第0个
            var numValue = arr.splice(index, 1)[0];
            // 两个新数组保存
            var left = [],
                right = [];
            //根据基数对剩余数组进行分类
            for (var i = 0; i < arr.length; i++) {
                if (numValue > arr[i]) {
                    left.push(arr[i]);
                } else {
                    right.push(arr[i]);
                }
            }
            // 返回值 递归函数  左边的数组拼接上基数和右边的数组
            return fn(left).concat(numValue, fn(right));
        }
        var arr1 = fn(arr);
        console.log(arr1);

数组去重

 // 1.遍历整个数组,拿每一个数,去跟其他数依次比较
        var arr = [1, 2, 3, 4, 4, 4, 2, 3, 1, 6];
        //控制做比较的数 控制趟数
        for (var i = 0; i < arr.length; i++) {
            //拿外层的数,跟其他数依次比较 拿i去比较j
            for (var j = i + 1; j < arr.length; j++) {
                if (arr[i] === arr[j]) {
                    //删除j
                    arr.splice(j, 1);
                    //解决删除j后,数组长度发生变化,
                    j--;
                }
            }
        }
        console.log(arr);

函数的递归

 //计算10的阶乘
        // var s = 1;
        // for (var i = 10; i > 0; i--) {
        //     s *= i;
        // }
        // console.log(s);

        //递归函数
        function fn(n) {
            if (n == 1) {
                return 1;
            }
            return n * fn(n - 1);
        }

        var num = fn(10);
        console.log(num);
        /*
            分析递归函数执行过程:
                n=10
                    10*fn(9)
                n=9
                    9*fn(8)         10*9*fn(8)
                n=8
                    8*fn(7)         10*9*8*fn(7)

                ...                 10*9*8*...*3*fn(2)
                n=2 
                    2*fn(1)          10*9*8*...*3*2*fn(1)
                n=1
                    1               10*9*8*...*3*2*1
        */
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个爱编程的男孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值