摘要:算法題斐波拉契數(shù)列冒泡排序好中壞改進(jìn)版初始時(shí)最后位置保持不變每趟開始時(shí)無記錄交換記錄交換的位置為下一趟排序作準(zhǔn)備選擇排序好中壞插入排序好平壞希爾排序好中壞歸并排序好平壞采用自上而下的遞歸方法快速排序好平壞
算法題 斐波拉契數(shù)列
function f(n) { if (n == 0 || n == 1) { return n; } else { return f(n-1) + f(n - 2); } }1.冒泡排序
好、中、壞:O(n)、O(n^2)、O(n^2)
function bubbleSort(arr) { var len = arr.length; var temp; for (var i = len; i >= 2; --i) { for (var j = 0; j <= i - 1; ++j) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; };
改進(jìn)版:
function bubbleSort2(arr) { var i = arr.length-1; // 初始時(shí),最后位置保持不變 while ( i> 0) { var pos= 0; // 每趟開始時(shí),無記錄交換 for (var j= 0; j< i; j++) if (arr[j]> arr[j+1]) { pos= j; // 記錄交換的位置 var tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp; } i= pos; //為下一趟排序作準(zhǔn)備 } return arr; }2.選擇排序
好 中 壞 : O(n^2)、O(n^2)、O(n^2)
function selectionSort(arr) { var min, temp; var len = arr.length; for (var i = 0; i < len - 1; ++i) { min = i; for (var j = i + 1; j < len; ++j) { if (arr[j] < arr[min]) { min = j; } temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } } return arr; }3.插入排序
好、平、壞:O(n^2)、O(n)、O(n^2)
function insertSort(arr) { var temp, i; var len = arr.length; for (var j = 1; j <= len - 1; ++j) { temp = arr[j]; i = j; while (i > 0 && (arr[i - 1] >= temp)) { arr[i] = arr[i - 1]; --i; } arr[i] = temp; } return arr; }4.希爾排序
好 中 壞 : O(n^1.3)、O(nlogn)-O(n^2)、O(n^2)
function shellsort(arr) { var len = arr.length; var h = 1; while (h < len / 3) { h = 3 * h + 1; } while (h >= 1) { for (var i = h; i < len; i++) { for (var j = i; j >= h && arr[j] < arr[j-h];j -= h) { temp = arr[j]; arr[j] = arr [j - h]; arr[j - h] = temp; } } h = (h-1)/3; } return arr; }5.歸并排序
好、平、壞:O(nlogn)、O(nlogn)、O(nlogn)
function mergeSort(arr) { //采用自上而下的遞歸方法 var len = arr.length; if(len < 2) { return arr; } var middle = Math.floor(len / 2), left = arr.slice(0, middle), right = arr.slice(middle); return merge(mergeSort(left), mergeSort(right)); } function merge(left, right) { var result = []; while (left.length && right.length) { if (left[0] <= right[0]) { result.push(left.shift()); } else { result.push(right.shift()); } } while (left.length) result.push(left.shift()); while (right.length) result.push(right.shift()); return result; }6.快速排序
好、平、壞:O(nlogn)、O(nlogn)、O(n^2)
function qSort(arr) { var len = arr.length; if (len == 0) { return []; } var left = []; var right = []; var flag = arr[0]; for (var i = 1; i < len; i++) { if (arr[i] < flag) { left.push(arr[i]); } else { right.push(arr[i]); } } return qSort(left).concat(flag, qSort(right)); } /////////////////////////////////////////////////////// var arr = [2,1,3,4,3]; var m = qSort(arr); console.log(m); //[1, 2, 3, 3, 4]BST遍歷
// 中序: function inOrder(node) { if (!(node == null)) { inOrder(node.left); putstr(node.show() + " "); inOrder(node.right); } } // 先序: function preOrder(node) { if (!(node == null)) { putstr(node.show() + " "); preOrder(node.left); preOrder(node.right); } } // 后序: function postOrder(node) { if (!(node == null)) { postOrder(node.left); postOrder(node.right); putstr(node.show() + " "); } }
DFS&BFS
// 深度優(yōu)先遍歷 function dfs(v) { this.marked[v] = true; for each(var w in this.adj[v]) { if (!this.marked[w]) { this.dfs(w); } } } // 廣度優(yōu)先遍歷 function bfs(s) { var queue = []; this.marked[s] = true; queue.push(s); // 添加到隊(duì)尾 while (queue.length > 0) { var v = queue.shift(); // 從隊(duì)首移除 if (v == undefined) { print("Visisted vertex: " + v); } for each(var w in this.adj[v]) { if (!this.marked[w]) { this.edgeTo[w] = v; this.marked[w] = true; queue.push(w); } } } }二分搜索算法
function binSearch(arr, data) { var upperBound = arr.length-1; var lowerBound = 0; while (lowerBound <= upperBound) { var mid = Math.floor((upperBound + lowerBound) / 2); if (arr[mid] < data) { lowerBound = mid + 1; } else if (arr[mid] > data) { upperBound = mid - 1; } else { return mid; } } return -1; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82175.html
摘要:逆向中常常出現(xiàn)一些加密算法,如果我們能對(duì)這些加密算法進(jìn)行快速識(shí)別則會(huì)大大減少我們逆向的難度,雖然已有密碼分析神器,但掌握手動(dòng)分析方法能幫助我們應(yīng)對(duì)更多的情況。這篇文章將介紹逆向中常見的單項(xiàng)散列算法和對(duì)稱加密算法的識(shí)別方法。 逆向中常常出現(xiàn)一些加密算法,如果我們能對(duì)這些加密算法進(jìn)行快速識(shí)別則會(huì)...
摘要:這是一個(gè)簡(jiǎn)單的遞歸函數(shù),你可以使用它來生成數(shù)列中指定序號(hào)的數(shù)值這個(gè)函數(shù)的問題在于它的執(zhí)行效率非常低有太多值在遞歸調(diào)用中被重新計(jì)算。 本章內(nèi)容銜接上一章 數(shù)據(jù)結(jié)構(gòu)與算法:二分查找 內(nèi)容提要 兩種基本數(shù)據(jù)結(jié)構(gòu): 數(shù)組 常見操作: 數(shù)組降維、數(shù)組去重 鏈表 遞歸:遞歸是很多算法都使用的一種編程方法 - 如何將問題分成基線條件和遞歸條件 - 分而治之策略解決棘手問題 ...
摘要:這是一個(gè)簡(jiǎn)單的遞歸函數(shù),你可以使用它來生成數(shù)列中指定序號(hào)的數(shù)值這個(gè)函數(shù)的問題在于它的執(zhí)行效率非常低有太多值在遞歸調(diào)用中被重新計(jì)算。 本章內(nèi)容銜接上一章 數(shù)據(jù)結(jié)構(gòu)與算法:二分查找 內(nèi)容提要 兩種基本數(shù)據(jù)結(jié)構(gòu): 數(shù)組 常見操作: 數(shù)組降維、數(shù)組去重 鏈表 遞歸:遞歸是很多算法都使用的一種編程方法 - 如何將問題分成基線條件和遞歸條件 - 分而治之策略解決棘手問題 ...
摘要:根搜索算法它的處理方式就是,設(shè)立若干種根對(duì)象,當(dāng)任何一個(gè)根對(duì)象到某一個(gè)對(duì)象均不可達(dá)時(shí),則認(rèn)為這個(gè)對(duì)象是可以被回收的。 引用計(jì)數(shù)算法 給對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器值就加1;當(dāng)引用失效時(shí),計(jì)數(shù)器值就減1;任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是不可能再被使用的。 缺點(diǎn):引用和去引用伴隨加法和減法,影響性能。 致命的缺陷:對(duì)于循環(huán)引用的對(duì)象無法進(jìn)行回收。 根搜索算法 它的...
摘要:本文介紹幾種常見排序算法選擇排序,插入排序,希爾排序,歸并排序,快速排序,堆排序,對(duì)算法的思路性質(zhì)特點(diǎn)具體步驟實(shí)現(xiàn)以及圖解進(jìn)行了全面的說明。最后對(duì)幾種排序算法進(jìn)行了比較和總結(jié)。 本文介紹幾種常見排序算法(選擇排序,插入排序,希爾排序,歸并排序,快速排序,堆排序),對(duì)算法的思路、性質(zhì)、特點(diǎn)、具體步驟、java實(shí)現(xiàn)以及trace圖解進(jìn)行了全面的說明。最后對(duì)幾種排序算法進(jìn)行了比較和總結(jié)。 寫...
閱讀 1454·2021-11-24 09:39
閱讀 3632·2021-09-29 09:47
閱讀 1580·2021-09-29 09:34
閱讀 3074·2021-09-10 10:51
閱讀 2541·2019-08-30 15:54
閱讀 3223·2019-08-30 15:54
閱讀 878·2019-08-30 11:07
閱讀 1011·2019-08-29 18:36