摘要:二分查找二分查找是一種在有序列表中查找某一特定元素的搜索算法。如果出現(xiàn)列表為空,則表示找不到該元素。這種搜索算法每一次比較都使搜索范圍縮小一半,時(shí)間復(fù)雜度為。
二分查找
二分查找是一種在有序列表中查找某一特定元素的搜索算法。從列表的中間元素開(kāi)始,如果中間元素正好是要查找的元素,則搜索過(guò)程結(jié)束;如果某一特定元素大于或者小于中間元素,則在列表大于或小于中間元素的那一半中查找,而且跟開(kāi)始一樣從中間元素開(kāi)始比較。如果出現(xiàn)列表為空,則表示找不到該元素。這種搜索算法每一次比較都使搜索范圍縮小一半,時(shí)間復(fù)雜度為Ο(logn) 。
"use strict" function binarySearch(orderedArr, start, end, value) { if (start > end) { return -1; } const middle = Math.floor((start + end) / 2); const middleVal = orderedArr[middle]; let newStart = start; let newEnd = end; if (middleVal > value) { newEnd = middle - 1; } else if ( middleVal < value) { newStart = middle + 1; } else { return middle; } return binarySearch(orderedArr, newStart, newEnd, value); } function find(arr, value){ return binarySearch(arr, 0, arr.length - 1, value); }快速排序
"use strict" /** * (1) */ function quickSort(arr) { if (arr.length <= 1) return arr; const pivotIndex = Math.floor(arr.length / 2); const pivot = arr.splice(pivotIndex, 1)[0]; const leftArr = []; const rightArr = []; for(let i = 0, len = arr.length; i < len; i++) { const item = arr[i]; if (item > pivot) { rightArr.push(item); } else { leftArr.push(item); } } return quickSort(leftArr).concat([pivot], quickSort(rightArr)); }
"use strict" /** * (2) */ function quickSort(arr, start, end) { if (start > end) return; const pivot = arr[end]; let position = start; for (let i = start; i < end; i++) { if (arr[i] < pivot ) { [arr[position], arr[i]] = [arr[i], arr[position]]; // swap position++; } } [arr[position], arr[end]] = [arr[end], arr[position]]; quickSort(arr, start, position - 1); quickSort(arr, position + 1, end); } function sort(arr) { return quickSort(arr, 0, arr.length - 1); }冒泡排序
"use strict" function bubbleSort(arr) { if (arr.length <=1 ) return arr; const len = arr.length; for (let i = 0; i < len; i++) { for (let j = i+1; j < len; j++) { if (arr[i] < arr[j]) { [arr[i], arr[j]] = [arr[j], arr[i]]; } } } return arr; }歸并排序
先拆分再合并
"use strict" /** * 遞歸方式(可能棧溢出) */ function merge(leftArr, rightArr) { // 合并 const newArr = []; while (leftArr.length > 0 && rightArr.length > 0) { if (leftArr[0] < rightArr[0]) { newArr.push(leftArr.shift()); } else { newArr.push(rightArr.shift()); } } return newArr.concat(leftArr).concat(rightArr); } function mergeSort(arr) { // 拆分 if (arr.length <= 1) return arr; const middle = Math.floor(arr.length / 2); const leftArr = arr.slice(0, middle); const rightArr = arr.slice(middle); return merge(mergeSort(leftArr), mergeSort(rightArr)); }選擇排序
選擇排序和冒泡排序很相近,不多次反復(fù)交換,是找到最大或最小的元素的位置,再做交換
"use strict" function selectSort(arr) { if (arr.length <= 1) return arr; const len = arr.length; for (let i = 0; i < len; i++) { let tempIndex = i; for (let j = i + 1; j < len; j++) { if (arr[j] < arr[tempIndex]) { tempIndex = j; } } [arr[i], arr[tempIndex]]=[arr[tempIndex], arr[i]]; } return arr; }插入排序
"use strict" function insertSort(arr) { if (arr.length <= 1) return arr; const len = arr.length; let preIndex, current; for (let i = 1; i < len; i++) { preIndex = i - 1; current = arr[i]; while (preIndex >= 0 && arr[preIndex] > current) { arr[preIndex+1] = arr[preIndex]; preIndex--; } arr[preIndex+1] = current; } return arr; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81278.html
摘要:快速排序是不穩(wěn)定的排序算法。瀏覽器的實(shí)現(xiàn)不同有什么影響排序算法不穩(wěn)定有什么影響舉個(gè)例子某市的機(jī)動(dòng)車牌照拍賣系統(tǒng),最終中標(biāo)的規(guī)則為按價(jià)格進(jìn)行倒排序相同價(jià)格則按照競(jìng)標(biāo)順位即價(jià)格提交時(shí)間進(jìn)行正排序。 本文要解決的問(wèn)題 1、找出 Array.prototype.sort 使用的什么排序算法 2、用一種直觀的方式展示 Array.prototype.sort 的時(shí)間復(fù)雜度,看看它有多快? 3、...
摘要:引言本文摘自設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐在現(xiàn)實(shí)中,很多時(shí)候也有多種途徑到達(dá)同一個(gè)目的地。將不變的部分和變化的部分隔開(kāi)是每個(gè)設(shè)計(jì)模式的主題,策略模式也不例外,策略模式的目的就是將算法的使用與算法的實(shí)現(xiàn)分離開(kāi)來(lái)。一個(gè)基于策略模式的程序至少由兩部分組成。 引言 本文摘自《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》 在現(xiàn)實(shí)中,很多時(shí)候也有多種途徑到達(dá)同一個(gè)目的地。比如我們要去某個(gè)地方旅游,可以根據(jù)具體的實(shí)...
摘要:道格拉斯普克抽稀算法,是用來(lái)對(duì)大量冗余的圖形數(shù)據(jù)點(diǎn)進(jìn)行壓縮以提取必要的數(shù)據(jù)點(diǎn)。經(jīng)道格拉斯普克法壓縮后得到的圖形如圖所示。但道格拉斯普克法較垂距法復(fù)雜且通常編程實(shí)現(xiàn)時(shí)需要采用遞歸方有一定的難度。 道格拉斯-普克抽稀算法,是用來(lái)對(duì)大量冗余的圖形數(shù)據(jù)點(diǎn)進(jìn)行壓縮以提取必要的數(shù)據(jù)點(diǎn)。該算法實(shí)現(xiàn)抽稀的過(guò)程是:先將一條曲線首尾點(diǎn)虛連一條直線,求其余各點(diǎn)到該直線的距離,取其最大者與規(guī)定的臨界值相比較,...
摘要:如果沒(méi)有學(xué)習(xí)過(guò)計(jì)算機(jī)科學(xué)的程序員,當(dāng)我們?cè)谔幚硪恍﹩?wèn)題時(shí),比較熟悉的數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,數(shù)組無(wú)疑是一個(gè)很好的選擇。 showImg(https://segmentfault.com/img/bVTSjt?w=400&h=300); 1、常見(jiàn) CSS 布局方式詳見(jiàn): 一些常見(jiàn)的 CSS 布局方式梳理,涉及 Flex 布局、Grid 布局、圣杯布局、雙飛翼布局等。http://cherryb...
閱讀 1829·2023-04-26 00:59
閱讀 3130·2021-11-15 18:10
閱讀 3072·2021-09-22 16:02
閱讀 766·2021-09-02 15:15
閱讀 3716·2019-08-30 15:56
閱讀 1917·2019-08-30 15:54
閱讀 2858·2019-08-29 16:31
閱讀 2035·2019-08-29 16:10