­

數組,數組方法及排序算法(冒泡排序,選擇排序,快速排序)

數組

數據結構

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 Array10//裏面參數指定對應的長度 沒寫表示長度為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]
forvar i=0;i<arr.length;i++){ //利用順序表的特點
    console.log(arr[i]) 

}

for in遍歷(下標 迭代器 next方法)(對象遍歷)
var arr=[1,2,3,4,56]
forvar index in arr){ //index表示為下標
    console.log(arr[index])
}
注意:for in中的i變量類型是字符串,而不是數字類型,所以for in專門用來遍歷對象,for in不會遍歷空元素
for of遍歷(迭代器來實現)(只能遍曆數組)
var arr=[1,2,3,4,56]
forvar 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(functiona,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,03)
 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))
    }
    
  • 希爾排序(插入排序的進階)

  • 插入排序(插入數據的時候排序)

  • 歸併排序(大數據排序的常用排序方法)

  • …….