首页 > 其他分享 >day05数组

day05数组

时间:2023-02-18 11:37:52浏览次数:30  
标签:arr console log day05 数组 var 下标

day05数组

数据结构(存储结构,逻辑结构)

概述:只要能存储数据的就是数据结构

存储结构
  • 顺序存储结构(查找的时候,数据越多,时间复杂度越高)
  • 链式存储结构
  • 索引存储结构
  • 散列存储结构(最快查找)
逻辑结构
线性结构
  • 数组

    又称之为顺序表,通过索引下标进行访问

  • 队列

    先进先出的容器

  • 先进后出

非线性结构
  • 链表

    通过对应指针来指向

  • 对应指针的指向

  • 二叉树

  • 散列表

    hash表(hashxode来进行编码的)

  • 广义表

  • ...

数组

概述:数组是一种线性的数据结构可以存储对应的数据 通过对应的索引下标进行数据访问 一般情况下数组内存储的数据类型是一样的.(可以存储不一样数据类型的数据)

数组的定义

使用 [] 赋值来定义

    var arr = []  //数组是一个对象
       console.log(arr)

var arr = [1,2,6]  //初始数据传入
       console.log(arr)

使用new关键词进行定义

    var arr = new Array()
       console.log(arr)
// 传入一个参数表示的是他的长度length,这个数组里面有8个值 empty
       var arr = new Array(8)
       console.log(arr)
//这个数组里面有三个值分别为1,2,8
       var arr = new Array(1,5,8)
       console.log(arr)
数组的特性

数组具备下标 可以通过下标进行赋值

数组具备length属性 length重新修改 大于可以扩容 小于的时候可以进行删除操作

var arr = [1,2,3,4,5]
//通过下标访问 下标从0开始
console.log(arr[0])//访问第一个元素
arr[3] = 18
console.log(arr)
//可以做到 自动扩容
arr[10] = 20
console.log(arr)
//通过length来访问对应的长度
console.log(arr.length)
//length可以赋值 大于会进行扩容操作 小于的时候会进行删除操作
arr.length = 2
console.log(arr)
console.log(arr.length)

数组的遍历

使用普通循环

var arr = [1,2,3]
for(var i=0;i<arr.length;i++){
console.log(arr[i])
}

使用es5新增的for in关键词

//for in es5新增关键词 是为了遍历对象 数组也是对象
    //for in 遍历的下标 对象是key
    for(var index in arr){
       console.log(index) //打印下标
       console.log(arr[index])
    }

使用es6新增的for of关键词

//for of es6 专门遍历数组(伪数组) 不能遍历对象
    for(var value of arr){
       console.log(value) //值
    }

for in 和 for of 区别

for in 使用于遍历对象,遍历对象的key es5

for in 使用于遍历数组 遍历的是数组的值 es6

练习

将一个数组中底二个元素和底三个元素进行位置互换

var arr = [2,3,1,5,6,7,3]
       function fn(arr){
           //假设第一个是最大值 同时也最小值
           var max = 0
           var min = 0
           //将对应的最大值和最小值和他比较 如果比最大值还大这个就是最大值,如果比最小值还小,这个就是最小值
           for(var i=1;i<arr.length;i++){
               if(arr[max]<arr[i]){ //如果比最大值还大,这个就是最大值
                   max = i
              }
               if(arr[min]>arr[i]){ //如果比最小值还小,这个就是最小值
                   min = i
              }
          }
           var temp = arr[min]
               arr[min]  = arr[max]
               arr[max] = temp
           return arr
      }
       console.log(fn(arr))

传入某个数组,返回第二大的数

 function fn1(arr){
if(arr.length<2){
return arr[0]
}
//得到最大值
    var max = arr[0] > arr[1]?arr[0]:arr[1]
    //得到第二大的值
    var twomax = arr[0] < arr[1]?arr[0]:arr[1]
    //再去比对
    for(var i = 2;i < arr.length;i++){
        if(arr[i]>max){ //如果比最大值还大,这个就是最大值,将最大值变为第二大的值
            twomax = max
            max = arr[i]
        }else{
           if(arr[i]>twomax){ //如果比最大值还小,那么比较这个值是否大于第二大的值
            twomax = arr[i]
        }
        }
       
    }
    return twomax
}
console.log(fn1([3,8,5,4,2,8,7,10,9,11]))

!数据的相关方法

所有的存储空间都具备增删改查的方法

增加(add push set)

删除(delete(删除就会回收) remove(删除后还在内存中) pop)

push 添加都后面(返回新的数组长度)

var arr = [1,2]
var newLength = arr.push(3)
console.log(newLength)//3
console.log(arr) //[1,2,3]

pop 删除最后一个(返回删除的元素)

var arr = [1,2]
var deleteItem = arr.pop()
console.log(deleteItem)//1
console.log(arr) //[1]

shift 删除第一个(返回删除的元素)

var arr = [1,2]
var deleteItem = arr.shift()
console.log(deleteItem)//1
console.log(arr) //[2]

unshift 添加到第一个(返回新的数组长度)

var arr = [1,2]
var deleteItem = arr.unshift(3)
console.log(deleteItem)//3
console.log(arr) //[3,1,2]

修改(replace set....)

覆盖

arr[0] = 新的值

先删再加 splice

var arr = [1,2,3]
//将下标为1的数值删除,删除一个,插入一个4和5
arr.splice(1,1,4,5)
console.log(arr) //[1,4,3]

splice删除操作

var arr = [1,2,3,4]
//省略个数 删除到最后
arr.splice(1)
console.log(arr)

var arr = [1,2,3,4,5]
arr.splice(1,2) //从下标为1的位置开始删,删除两个(包含下标1)
console.log(arr)

splice增加操作

var arr = [1,2,3,4]
arr.splice(2,0,4,5) //从下标为2的位置 删除位置给0就是添加 添加4和5
console.log(arr)

splice 返回的是删除的数据组成的数组

查询(query select get ...)

indexOf 根据传入的值查询第一次出现下标

根据索引查询 indexOf 返回的就是index(传入对应元素,返回下标,如果没有返回-1)

var arr = [2,4,7,6,8,4]
console.log(arrOf(4))//1
console.log(arrOf(4,2))//查询数值为4 并且从下标为2开始查询

简单实现indexOf

var arr = [1,2,3,4,5,6,7,8,9,10]
function myIndexOf(value,start){
if(value == undefined){
throw new Error('为传入参数')
}
if(start == undefined){
start = 0
}
for(var i = start;i<arr.length;i++){
if(arr[i] == value){
return i
}
}
return -1
}
console.log(myIndexOf(4,8)) //10

反向

var arr = [1,2,3,4,9,10,4]
function myIndexOf(value,last){
if(value == undefined){
throw new Error('未传入参数')
}
if(last == undefined){
last = arr.length
}else if(typeof last != 'number'){
throw new Error('不是number类型')
}
for(var i = last;i>=0;i--){
if(arr[i] == value){
return i
}
}
return -1
}
console.log(myIndexOf(4,5))//3

以上方法会对于原本数值有影响

不影响原本的数组的方法(一定有返回值)

数组拼接 concat

var arr1 = [1,2]
var arr2 = [3,4]
//数组的concat方法传入的参数必须是数组
var concatArr = arr1.concat(arr2)
console.log(arr1)//[1,2]
console.log(arr2)//[3,4]
console.log(concatArr) //[1,2,3,4]

slice 截取 返回新的数组

var arr = [1,2,3,4,5,6]
//传入一个开始下标 结束下标(没有结束下标默认截取到末尾)不包含结束下标
var sliceArr = arr.slice(4,5)
console.log(sliceArr)

join 将对应的数组转为字符串

var arr = [,1,2,3,4,5]
//join如果不传入参数默认使用,来进行分割每一个元素
var str = arr.join('a')//传入一定是字符串
console.log(str)
位置排序方法
var arr = [2,3,4,5,8,7,2]
//默认情况下 sort方法是按照ASCII码排序
arr.sort()

//高阶函数用法 将函数作为参数的函数叫做高阶函数
var newArr = arr.sort(function(a,b){
return a-b //正序
})
console.log(arr)
console.log(newArr)
console.log(newArr == arr)

//反转方法
var arr1 = arr.reverse
console.log(arr)
console.log(arr1 == arr)

排序算法

常用的排序算法 (On2)

冒泡排序 (逐层冒泡)

选择排序 (选择一个数跟其他的进行比较)

插入排序 (在插入数据的时候的排序)

希尔排序 (快速插入排序)

快速排序 (快速冒泡排序 数据不大的情况下最快)

归并排序 (大数据处理最快)

堆排序

桶排序

冒泡排序

前一个和后一个比较 两两相比较,比较晚就交换位置,知道所有内容比较完

function bubleSort(arr){
for(var i = 0;i<arr.length-1;i++){
for(var j = 1;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
}
选择排序

选择一个下标和所有的数进行比较 如果比较完发现这个下标不是之前的下标就换位置

 function selectorSort(arr) {
            for (var i = 0; i < arr.length - 1; i++) {
                //指定max为当前遍历的下标
                var max = i
                //max要跟其他所有的未排序的比较
                for (var j = i + 1; j < arr.length; j++) {
                    if (arr[max] < arr[j]) {
                        max = j
                    }
                }
                //如果最大值不是原本的下标位置就需要交换位置了
                if (max != i) {
                    var temp = arr[max]
                    arr[max] = arr[i]
                    arr[i] = temp
                }

            }
        }
快速排序(二分排序)
function quiKSort(arr){
//如果你的数组长度只有一个 或者没有就直接返回这个数组
if(arr.length<=1){
return arr
}
//中间值去第一个
var mid = arr[0]
//左边容器
var left = []
//右边容器
right = []
//循环比较
for(var i=1;i<arr.length;i++){
arr[i]>mid?right.push(arr[i]):left.push(arr[i])
}
//递归调用无限去中间值
return quiKSort(left).concat(mid).concat(quiKSort(right))
}
console.log(quiKSort([50,41,20,32,58,99]))
 

标签:arr,console,log,day05,数组,var,下标
From: https://www.cnblogs.com/buyAVnub/p/17132209.html

相关文章