数组,数组方法及排序算法(冒泡排序,选择排序,快速排序)

数组

数据结构

1.逻辑结构
2.存储结构:数据存储的结构方式

线性结构

  • 数组(顺序表)
  • 队列
  • 链表

非线性结构

  • hash(散列表)
(只要是能存数据的容器 就必须具备增删改查的方法)
3.算法

数组

数组概述:数组固定一类数据的组合(一般情况下数组里面的类型一致)(多个数据)

数组的核心

(为什么能遍历)数组是一个顺序表,对应依赖下标来实现的

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

1.使用[]声明数组

var arr = [1,2,3] //里面的数据用,分开
[1,2,3]==[1,2,3]  //fasle 引用数据类型比较地址
console.log(arr['0']) // 1 可以允许字符串
arr[0]=10   //可以赋值

2.使用new 关键词进行声明(对象)(单个参数表示长度 多个参数表示数据)

var arr = new Array(10)  //里面参数指定对应的长度 没写表示长度为0
console.log(arr1[0])   // undefined

length属性来访问对应的长度,也可以设置

var arr = new Array()
console.log(arr.length)   // 0
arr.length=11   // 设置对应的长度
console.log(arr) 

数组元素随机给值

var arr = new Array()
for(i=0;i<10;i++){
    arr[i]=Math.random()  //0-1之间的随机数 包含0不包含1
}
console.log(arr)
数组遍历
传统for循环遍历
var arr=[1,2,3,4,56]
for(var i=0;i<arr.length;i++){ //利用顺序表的特点
    console.log(arr[i]) 

}

for in遍历(下标 迭代器 next方法)(对象遍历)
var arr=[1,2,3,4,56]
for(var index in arr){ //index表示为下标
    console.log(arr[index])
}
注意:for in中的i变量类型是字符串,而不是数字类型,所以for in专门用来遍历对象,for in不会遍历空元素
for of遍历(迭代器来实现)(只能遍历数组)
var arr=[1,2,3,4,56]
for(var value of arr){ //value表示的是里面的值
    console.log(value)
}

基础类型和引用类型

简单类型传递值,复杂类型传递地址

简单数据类型:number、string、boolean、undefined、null
复杂数据类型:Array、function, Object

其实函数也是一种类型:

function abc(){}
console.log(typeof abc); // function

值传递时将内存空间的值直接改变
代码:

var num = 11;
var num1 = num;
num = 20;
console.log(num); //20  引用传递时将值改变了,但是地址没有改变
console.log(num1)  //11
数组的方法

数组是一个存储结构(增删改查的操作)

添加(add push append)

栈方法(先进后出 后进先出)(有底无顶的容器)

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]
var arr =[1,2,3]和var arr =[4,5,6]不是一个东西

队列方法

shift方法(删除第一个)

var arr =[1,2,3]
arr.shift()   //通过下标找 下标一般不写
//对应的返回值是被删除的那个值
console.log(arr)   //[2,3]
修改(replace替换 update更新)

反转 reverse(将最后一个变到第一个 以此类推交换位置)

var arr= [1,2,3,4,5]
arr.reverse()  //返回反转后的数组(就是原本的数组)
console.log(arr)  //[5,4,3,2,1]
//arr.reverse和arr是一个东西

排序 sort(默认情况下是根据第一个字符的ACSII码进行排序)

var arr= [15,20,11,4,5]
arr.sort()  //返回排序后的数组(就是原本的数组)
console.log(arr)  //[11,15,20,4,5]
//arr.sort和arr是一个东西

sort 其实是一个高阶函数 高阶函数就是里面用函数做为参考的函数

var arr= [15,20,11,4,5]
arr.sort(function(a,b){
//1 和-1进行大小区分和排序规则
    return a-b  //a-b是正序  b-a是倒序
}  //返回排序后的数组(就是原本的数组)
console.log(arr)

concat slice(不会影响原本数组的方法 返回新的数组)

concat 连接 把多个数组变成一个数组返回 ... 扩展运算符(可以写多个)?(表示可写可不写)

//不会影响原本数组的方法 返回新的数组
var arr  = [1,2,3,4]
var arr1 = [1,2,3,4]
var arr2 = [1,2,3,4]
var arr3 = [1,2,3,4]
var newArr = arr.concat(arr1,arr2,arr3)//  打开数组取出里面的值
console.log(newArr);

slice 截取 把一个数组里面的东西提出 返回新的数组

var arr[1,2,3,4]
var sliceArr=arr.slice()  //不写参数全切
console.log(sliceArr) // [1,2,3,4]

var sliceArr1=arr.slice(0)  //从0开始切到最后 如果下标不存在返回一个空数组如arr.slice(10)
console.log(sliceArr1) // [1,2,3,4]

var sliceArr2=arr.slice(2,3)  //不包含3
console.log(sliceArr2) // [3]
contat方法slice方法返回的数组跟原本的数组不是一个对象 但是里面的值或者对象的地址是一样的(浅拷贝)
splice方法(会影响原来数组 可以删除 截取插入 )
var arr=[12,13,45]
var newArr=arr.splice(0)   //从第一个开始删(全删)
console.log(newArr) //[12,13,45]
console.log(arr) //[]

 var newArr = arr.splice(1,3)
 //参数两个 开始位置 删除的个数(可写可不写 不写默认数组length) 操作后返回一个新的数组
    console.log(newArr) //[13,45,1]      
    console.log(arr) //[12,2,3]

 var newArr = arr.splice(1,0,3)
 console.log(newArr) //[12,3,13,45] 

排序算法
  • 冒泡排序(最基础的排序) O(n^2)

    比较的趟数为(lenght-1)

    每一趟比较(length-i)次

    外层i循环为躺数

    内层j循环为每趟比较的次数

    var arr = [12, 4, 8, 3, 56, 34, 26]
    
            function bubble(arr) {
                for (i = 1; i < arr.length; i++) {
                    for (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
            }
            console.log(bubble(arr));
    
  • 选择排序(选择最大值的下标或者最小值的下标进行比较的排序)O(n^2)

    function selecter(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
    }
    
  • 快速排序(在数据量不多时最快 冒泡排序的进阶)O(nlogn)

    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))
    }
    
  • 希尔排序(插入排序的进阶)

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

  • 归并排序(大数据排序的常用排序方法)

  • .......

posted @ 2022-08-07 17:59  叮叮巴士  阅读(317)  评论(0编辑  收藏  举报