數組,數組方法及排序算法(冒泡排序,選擇排序,快速排序)
- 2022 年 8 月 7 日
- 筆記
數組
數據結構
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)) }
-
希爾排序(插入排序的進階)
-
插入排序(插入數據的時候排序)
-
歸併排序(大數據排序的常用排序方法)
-
…….