摘要:優(yōu)化當(dāng)待排序序列長度時(shí),使用插入排序,可以加速排序。插入排序原理通過構(gòu)建有序序列,對于未排序元素,在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。堆排序可通過樹形結(jié)構(gòu)保存部分比較結(jié)果,可減少比較次數(shù)。
前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總
歡迎提issues斧正:排序算法
JavaScript-排序算法及簡易優(yōu)化 快速排序原理:在待排序序列中選一個(gè)分割元素,將待排序序列分隔成獨(dú)立的子序列,子序列1里的元素比分割元素元素都小(大),子序列2反之,遞歸進(jìn)行此操作,以達(dá)到子序列都有序。最后將子序列用concat方法連接起來即是排序好的序列。
function quickSort(arr){ if(arr.length <= 1){ return arr; } var num = Math.floor(arr.length/2); var numValue = arr.splice(num,1); var left = []; var right = []; for(var i = 0;i優(yōu)化:當(dāng)待排序序列長度N < 10時(shí),使用插入排序,可以加速排序。
function quickSort(arr){ if(arr.length <= 1){ return arr; } if(arr.length < 10){ insertSort(arr); } var num = Math.floor(arr.length/2); var numValue = arr.splice(num,1); var left = []; var right = []; for(var i = 0;i插入排序 原理:通過構(gòu)建有序序列,對于未排序元素,在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。一般可以將第一個(gè)元素作為有序序列,用未排序的元素與之相比,插入,直到排序完畢。
function insertSort(arr){ var len = arr.length; if(len <= 1){ return arr; } for(var i = 1;itmp){ arr[j] = arr[j-1]; --j; } arr[j] = tmp; } return arr; } console.log(insertSort([1,45,43,4,56,7,20,1])); //[1, 1, 4, 7, 20, 43, 45, 56] 優(yōu)化:二分插入排序,在有序序列中使用二分查找法查找一個(gè)插入位置,減少元素比較次數(shù)
function binaryInsertSort(arr){ var len = arr.length; if(len <= 1){ return arr; } for (var i = 1; i < len; i++) { var tmp = arr[i], left = 0, right = i - 1; while (left <= right) { var index = parseInt((left + right) / 2); if (tmp < arr[index]) { right = index - 1; } else { left = index + 1; } } for (var j = i - 1; j >= left; j--) { arr[j + 1] = arr[j]; } arr[left] = tmp; } return arr; } console.log(binaryInsertSort([1,45,43,4,56,7,20,1,2,3,4,56,3])); //[1, 1, 2, 3, 3, 4, 4, 7, 20, 43, 45, 56, 56]選擇排序原理:在待排序序列中找到最?。ù螅┰兀旁谛蛄械钠鹗嘉恢?,然后,再從剩余元素中尋找最?。ù螅┰兀缓蠓诺揭雅判蛐蛄械哪┪?。重復(fù),直到所有元素均排序完畢。
Array.prototype.selectionSort = Array.prototype.selectionSort || function(){ var len = this.length; if(len <= 1){ return this; } var min,tmp; for(var i = 0;i優(yōu)化:堆排序,在直接選擇排序中,為了從序列中選出關(guān)鍵字最?。ㄗ畲螅┑挠涗?,必須進(jìn)行n-1次比較,接著在剩下序列中選出最?。ㄗ畲螅┑脑兀中枰鰊-2次比較。但是,在n-2次比較中,有的比較可能在前面的n-1次比較中已經(jīng)做過,但由于前一趟排序時(shí)未保留這些比較結(jié)果,所以后一趟排序時(shí)又重復(fù)執(zhí)行了這些比較操作。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。堆排序可通過樹形結(jié)構(gòu)保存部分比較結(jié)果,可減少比較次數(shù)。
function heapSort(arr) { function swap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } function maxHeapify(arr, index, heapSize) { var iMax,iLeft,iRight; while (true) { iMax = index; iLeft = 2 * index + 1; iRight = 2 * (index + 1); if (iLeft < heapSize && arr[index] < arr[iLeft]) { iMax = iLeft; } if (iRight < heapSize && arr[iMax] < arr[iRight]) { iMax = iRight; } if (iMax != index) { swap(arr, iMax, index); index = iMax; } else { break; } } } function buildMaxHeap(arr) { var i,iParent = Math.floor(arr.length / 2) - 1; for (i = iParent; i >= 0; i--) { maxHeapify(arr, i, arr.length); } } function sort(arr) { buildMaxHeap(arr); for (var i = arr.length - 1; i > 0; i--) { swap(arr, 0, i); maxHeapify(arr, 0, i); } return arr; } return sort(arr); } console.log(heapSort([1,45,43,4,56,7,20,1,2,3,4,56,3])); //[1, 1, 2, 3, 3, 4, 4, 7, 20, 43, 45, 56, 56]冒泡排序原理:從第一個(gè)元素開始,一次比較兩個(gè)元素,如果arr[n]大于arr[n+1],就交換。重復(fù)遍歷直到?jīng)]有再需要交換,排序完成。
function bubbleSort(arr){ var len = arr.length; if(len <= 1){ return arr; } var tmp; for(var i = 0;i優(yōu)化:上面代碼中,里面一層循環(huán)在某次掃描中沒有發(fā)生交換,說明此時(shí)數(shù)組已經(jīng)全部排好序,后面的步驟就無需再執(zhí)行了。因此,增加一個(gè)標(biāo)記,每次發(fā)生交換,就標(biāo)記,如果某次循環(huán)完沒有標(biāo)記,則說明已經(jīng)完成排序。
function bubbleSort(arr) { var len = arr.length; if(len <= 1){ return arr; } var bSwaped = true; for (var i = 0; i < len -1; i++) { // 每次先重置為false bSwaped = false; for (var j = len - 1; j > i ; j--) { if (arr[j-1] > arr[j]) { var temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; bSwaped = true; } } // 如果上一次掃描沒有發(fā)生交換,則說明數(shù)組已經(jīng)全部有序,退出循環(huán) if (!bSwaped){ break; } } return arr; } console.log(bubbleSort([1,45,43,4,56,7,20,1])); //[1, 1, 4, 7, 20, 43, 45, 56]在上一步優(yōu)化的基礎(chǔ)上進(jìn)一步思考:如果R[0..i]已是有序區(qū)間,上次的掃描區(qū)間是R[i..n],記上次掃描時(shí)最后一次發(fā)生交換的位置是lastSwapPos,那么lastSwapPos會(huì)在在i與n之間,所以R[i..lastSwapPos]區(qū)間是有序的,否則這個(gè)區(qū)間也會(huì)發(fā)生交換;所以下次掃描區(qū)間就可以由R[i..n]縮減到[lastSwapPos..n] :
function bubbleSort(arr){ var len = arr.length; if(len <= 1){ return arr; } var lastSwapPos = 0, lastSwapPosTemp = 0; for (var i = 0; i < len - 1; i++){ lastSwapPos = lastSwapPosTemp; for (var j = len - 1; j > lastSwapPos; j--){ if (arr[j - 1] > arr[j]){ var temp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = temp; lastSwapPosTemp = j; } } if (lastSwapPos == lastSwapPosTemp){ break; } } return arr; } console.log(bubbleSort([1,45,43,4,56,7,20,1])); //[1, 1, 4, 7, 20, 43, 45, 56]這一些列優(yōu)化都需要測速才知道有沒有優(yōu)化成功,只是簡單的測試一兩個(gè)數(shù)組是不容易看出來的。我們可以造一些很大的數(shù)據(jù)去測試,再用一個(gè)比較簡單的測試時(shí)間的方法,隨機(jī)創(chuàng)建10萬個(gè)數(shù):
var arr = []; var num = 0; for(var i = 0; i < 100000; i++){ num = Math.floor(Math.random()*100000); arr.push(num); } console.time("testTime"); bubbleSort(arr); console.timeEnd("testTime"); ==> testTime: 21900.684ms (比較數(shù)目越多,差距越大,更好對比)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79911.html
摘要:在上面的三種排序中,它們的效率為用大表示法來表示都是,但實(shí)際上按比較的次數(shù)和交換的次數(shù)來考慮,插入排序效率高于選擇排序,選擇排序效率高于冒泡排序。大表示法常見的基于的走勢圖如下圖所示 大O表示法初體驗(yàn) 身在斯洛文尼亞的阿拉里克得到斯提里科被殺的消息后,仰天大笑:終于沒有人能阻止我去羅馬了。當(dāng)他手下的將軍問:不知大王打算走哪條路去羅馬?西哥特王哈哈大笑,說出了那句千古名言:All roa...
摘要:創(chuàng)建數(shù)組數(shù)組字面量數(shù)組構(gòu)造函數(shù)參數(shù)為數(shù)組建議使用數(shù)組字面量方式,性能好,代碼少,簡潔,畢竟代碼少。數(shù)組判斷方法用來判斷某個(gè)值是否為。的這是最簡潔最直接的遍歷數(shù)組元素的語法。把數(shù)組轉(zhuǎn)換為本地?cái)?shù)組,并返回結(jié)果。 前端學(xué)習(xí):前端教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)組&數(shù)組方法使用詳解 Array對象 之前一...
摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過來給道典型的面試題前端掘金在界中,開發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實(shí)現(xiàn) 選擇排序 簡介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...
摘要:特意對前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
Llama3-8B-Chinese-Chat 是基于 Meta-Llama-3-8B-Instruct 模型通過 ORPO進(jìn)行微調(diào)的中文聊天模型。與原始的 Meta-Llama-3-8B-Instruct 模型相比,此模型顯著減少了中文問題英文回答"和混合中英文回答的問題。此外,相較于原模型,新模型在回答中大量減少了表情符號(hào)的使用,使得回應(yīng)更加正式。與 Llama-3-8B-nsturc...
閱讀 1995·2021-09-26 10:19
閱讀 3268·2021-09-24 10:25
閱讀 1658·2019-12-27 11:39
閱讀 1940·2019-08-30 15:43
閱讀 687·2019-08-29 16:08
閱讀 3517·2019-08-29 16:07
閱讀 918·2019-08-26 11:30
閱讀 1280·2019-08-26 10:41