❶ js三大排序演算法
冒泡排序思想:讓數組中的當前項和後一項進行比較,如果當前項比後一項大的話則兩項交換位置,讓大的靠後即可。
插入排序思想:通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
快速排序思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
❷ 【JS演算法】JS數據結構
數組: 是由相同類型的元素的集合所組成的數據結構,分配一塊連續的內存來存儲。知道第一個元素的內存地址,加上下標(偏移量)就能找到第2或N個。
數組隨機訪問的速度快,增加和刪除則慢(因為刪除index2,後面的3-n都要往前挪一位)
鏈表: 非連續存儲的指向型存儲,隨機訪問的速度慢(需一層層查找),增加和刪除則快(不需要挪位)
樹形結構、圖形結構
樹形結構又指向其他樹點,就是圖形結構
圖結構,在webpack和vite中有用到,作用是,能找出是否有文件被重復載入
堆和棧
對象是數組+鏈表的結構
只要是樹形結構,解答基本都可以用遞歸解決
❸ 【JS演算法】回溯演算法
題目:全排列
給定一個不含重復數字的數組 nums ,返回其 所有可能的全排列
輸入:nums = [1,2,3] //目標數組
輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
這里用回溯是避免重復,導致答案錯誤
❹ JS常見排序演算法
排序演算法說明:
(1)對於評述演算法優劣術語的說明
穩定 :如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定 :如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
內排序 :所有排序操作都在內存中完成;
外排序 :由於數據太大,因此把數據放在磁碟中,而排序通過磁碟和內存的數據傳輸才能進行;
時間復雜度 : 一個演算法執行所耗費的時間。
空間復雜度 : 運行完一個程序所需內存的大小。
(2)排序演算法圖片總結:
1.冒泡排序:
解析:1.比較相鄰的兩個元素,如果前一個比後一個大,則交換位置。
2.第一輪的時候最後一個元素應該是最大的一個。
3.按照步驟一的方法進行相鄰兩個元素的比較,這個時候由於最後一個元素已經是最大的了,所以最後一個元素不用比較。
2.快速排序:
解析:快速排序是對冒泡排序的一種改進,第一趟排序時將數據分成兩部分,一部分比另一部分的所有數據都要小。然後遞歸調用,在兩邊都實行快速排序。
3.插入排序:
解析:
(1) 從第一個元素開始,該元素可以認為已經被排序
(2) 取出下一個元素,在已經排序的元素序列中從後向前掃描
(3) 如果該元素(已排序)大於新元素,將該元素移到下一位置
(4) 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
(5)將新元素插入到下一位置中
(6) 重復步驟2
2.二分查找:
解析:二分查找,也為折半查找。首先要找到一個中間值,通過與中間值比較,大的放又,小的放在左邊。再在兩邊中尋找中間值,持續以上操作,直到找到所在位置為止。
(1)遞歸方法
(2)非遞歸方法
4.選擇排序:
解析:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
以此類推,直到所有元素均排序完畢。
5.希爾排序:
解析:先將整個待排序的記錄序列分割成為若乾子序列分別進行直接插入排序
6.歸並排序:
解析:歸並排序是一種穩定的排序方法。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。
7.堆排序:
解析:堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是
小於(或者大於)它的父節點。
8.計數排序:
解析:計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。然後根據數組C來將A中的元素排到正確的位置。它只能對整數進行排序。
9.桶排序:
解析:假設輸入數據服從均勻分布,將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序演算法或是以遞歸方式繼續使用桶排序進行排
10.基數排序:
解析:基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優
先級排序。最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前。基數排序基於分別排序,分別收集,所以是穩定的。
基數排序 vs 計數排序 vs 桶排序
這三種排序演算法都利用了桶的概念,但對桶的使用方法上有明顯差異:
基數排序:根據鍵值的每位數字來分配桶 計數排序:每個桶只存儲單一鍵值 桶排序:每個桶存儲一定范圍的數值
❺ js幾種常見的排序演算法
原理:比較兩個相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重復第一趟步驟,直至全部排序完成。
N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數為(N-i)次,所以可以用雙重循環語句,外層控制循環多少趟,內層控制每一趟的循環次數。
冒泡排序的優點:每進行一趟排序,就會少比較一次,因為每進行一趟排序都會找出一個較大值。如上例:第一趟比較之後,排在最後的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最後一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只需要比較除了最後兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了演算法的量。
冒泡排序優化版:
一.選擇排序原理
1.每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置
2.再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到剛才已排序序列的後面。
3.以此類推,直到全部待排序的數據元素排完。
選擇排序是不穩定的排序方法。例如:序列3,3,2,1, 我們知道第一次遍歷的時候,選擇最後一個元素1和第一個元素3交換,那麼原序列中2個3的相對前後順序就和之前不一樣了,所以選擇排序不是一個穩定的排序演算法。
二.選擇排序時間復雜度
第一次循環比較 n - 1次,第二次循環比較 n - 2次,依次類推,最後一個元素不需要比較,因此共進行 n - 1次循環,最後一次循環比較1次。
因此一共比較1 + 2 + 3 + ... +(n - 2)+(n - 1)次,求和得n2/2 - n / 2 ,忽略系數,取最高指數項,該排序的時間復雜度為O(n2)
選擇排序優化版:
插入排序:
❻ JS常用的排序演算法有哪些,如何實現這些演算法
1.冒泡排序
var bubbleSort = function (arr) {
var flag = true;
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
flag = true;
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = false;
}
}
if (flag) {
break;
}
}
};
2.選擇排序
var selectSort = function (arr) {
var min;
for (var i = 0; i < arr.length-1; i++) {
min = i;
❼ js實現遞歸演算法
<!DOCTYPE >
<html>
<head>
<meta content="" charset="utf-8">
<title>函數的遞歸調用</title>
</head>
<body>
<script>
//遞歸的概念:自己調用自己
//注意:使用遞歸的時候必須有一個結束標志,否則會報內存溢出的錯誤 Maximum call stack size exceeded;
/* 1.案例一:求1,2,3...n 的和 */
function fn(n){
if(n===1){
return 1;
}
return n+fn(n-1);
}
//console.log(fn(3));
/* 2.案例二:求1,2,3...到n的階乘 */
function getFactorial(n){
if(n===1){
return 1;
}
return n * getFactorial(n-1);
}
//console.log(getFactorial(3));
/* 案例三:斐波那契數列 *///第n個數等於前兩個數的和,除第一個數跟第二個樹外:如1,1,2,3,5,8,11,19,30...
function getNFibonacciSequence(n){
if(n===1 || n===2){
return 1;
}
return getNFibonacciSequence(n-1)+getNFibonacciSequence(n-2);
}
console.log(getNFibonacciSequence(4));
</script>
</body>
</html>
❽ 求個JS演算法
把三個坐標點放到一個數組里:
vard=[[0,0],[10,0],[5,5]];
然後用個變數i表示A點在數組d中的初始序號:
vari=0;
這樣ABC三個點的坐標就是:
vara,b,c
a=d[i];
b=d[(i+1)%3];
c=d[(i+2)%3];
向右旋轉時:
a=d[++i%3];
b=d[(i+1)%3];
c=d[(i+2)%3];
向左旋轉時:
a=d[--i<0?2:i];
b=d[(i+1)%3];
c=d[(i+2)%3];
❾ 如何用js實現線性回歸演算法
可以用函數 regress( )來解決。
[b,bint,r,rint,stats] = regress(y,X)
b——擬合線性函數的系數
bint——系數b的置信區間
r——殘值向量
rint——殘值的置信區間
stats——檢驗統計量,第一值是回歸方程的置信度,第二值是F統計量,第三值是與F統計量相應的p值,當p值很小,說明回歸模型成立
X——自變數向量,X=[ones(3,1) x1 x2 x3]
y——應變數向量