摘要:高級(jí)排序算法總結(jié)希爾排序間隔序列可以動(dòng)態(tài)定義,不過對(duì)于大部分的實(shí)際應(yīng)用場景,算法要用到的間隔序列可以提前定義好有一些公開定義的間隔序列,使用它們會(huì)得到不同的結(jié)果。
高級(jí)排序算法總結(jié)
希爾排序
function shellsort(array, gaps) { for (var g = 0; g < gaps.length; g++) { for (var i = gaps[g]; i < array.length; i++) { var temp = array[i]; for (var j = i; (j >= gaps[g]) && (temp < array[j-gaps[g]]);j -= gaps[g]) { array[j] = array[j - gaps[g]]; } array[j] = temp; } console.log(array); } }
間隔序列 gaps可以動(dòng)態(tài)定義,不過對(duì)于大部分的實(shí)際應(yīng)用場景,算法要用到的間隔序列可以提前定義好,有一些公開定義的間隔序列,使用它們會(huì)得到不同的結(jié)果。例如Marcin Ciura 在2001 的論文“Best Increments for theAverage Case of Shell Sort”中的間隔序列[701, 301, 132, 57, 23, 10, 4, 1],下一節(jié)將介紹具有動(dòng)態(tài)間隔序列的希爾排序.
動(dòng)態(tài)間隔序列希爾排序
function dynOrdShellsort(array) { var N = array.length; var h = 1; while (h < N/3) {h = 3 * h + 1; } while (h >= 1) { for (var i = h; i < N; i++) { for (var j = i; j >= h && array[j] < array[j-h]; j -= h) { // swap(array, j, j-h); [array[j], array[j-h]] = [array[j-h], array[j]]; } }h = (h-1)/3; } }
在《算法(第 4 版)》(人郵版)的合著者 Robert Sedgewick 定義了一個(gè) shellsort() 函數(shù),在這個(gè)函數(shù)中可以通過一個(gè)公式來對(duì)希爾排序用到的間隔序列進(jìn)行動(dòng)態(tài)計(jì)算。Sedgewick 的算法是通過上面的代碼片段來決定初始間隔值的,并添加到外層 for 循環(huán).
歸并排序
let mergeSort = (function () { function mergeSort(arr) { if (arr.length < 2) { return; } var step = 1; var left, right; while (step < arr.length) { left = 0; right = step; while (right + step <= arr.length) { mergeArrays(arr, left, left+step, right, right+step); left = right + step; right = left + step; } if (right < arr.length) { mergeArrays(arr, left, left+step, right, arr.length); } step *= 2; } } function mergeArrays(arr, startLeft, stopLeft, startRight, stopRight) { var rightArr = new Array(stopRight - startRight + 1); var leftArr = new Array(stopLeft - startLeft + 1); k = startRight; for (var i = 0; i < (rightArr.length-1); ++i) { rightArr[i] = arr[k]; ++k; } k = startLeft; for (var i = 0; i < (leftArr.length-1); ++i) { leftArr[i] = arr[k]; ++k; } rightArr[rightArr.length-1] = Infinity; // 哨兵值 leftArr[leftArr.length-1] = Infinity; // 哨兵值 var m = 0; var n = 0; for (var k = startLeft; k < stopRight; ++k) { if (leftArr[m] <= rightArr[n]) { arr[k] = leftArr[m]; m++; } else { arr[k] = rightArr[n]; n++; } } // console.log("left array - ", leftArr); // console.log("right array - ", rightArr); } return mergeSort; })()
快速排序
function qSort(arr){ if (arr.length == 0) { return []; } var left = []; var right = []; var pivot = arr[0]; for (var i = 1; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return qSort(left).concat(pivot, qSort(right)); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/107158.html
摘要:基本排序算法總結(jié)前言隨著的興起將推向的一個(gè)前所未有的高度作為為建立高性能的服務(wù)端而創(chuàng)建的運(yùn)行平臺(tái)隨著時(shí)間的推移和生態(tài)鏈的完善已經(jīng)不再局部于服務(wù)端包括前端后端桌面這篇文章介紹的傳統(tǒng)的散打排序方法并用實(shí)現(xiàn)其功能如有需要可以對(duì)其封裝在隨后會(huì)介紹高 基本排序算法總結(jié) 前言 隨著node的興起, 將javascript推向的一個(gè)前所未有的高度, node作為為建立高性能的服務(wù)端而創(chuàng)建的js運(yùn)行平...
摘要:高級(jí)排序算法有希爾排序歸并排序快速排序。冒泡排序首先聲明,這是最慢的排序算法之一,但是也是最容易實(shí)現(xiàn)的排序算法。穩(wěn)定性冒泡排序?yàn)橐环N穩(wěn)定排序??焖倥判蚩焖倥判蚴浅隽Υ髷?shù)據(jù)集最快的排序算法之一。 簡介 對(duì)計(jì)算機(jī)中存儲(chǔ)的數(shù)據(jù)執(zhí)行的兩種最常見的操作是排序和檢索,也是面試經(jīng)常會(huì)被問到的一個(gè)知識(shí)點(diǎn),本文將整理數(shù)據(jù)排序的基本算法和高級(jí)算法。其中基本排序算法有:冒泡排序、選擇排序、插入排序。高級(jí)排序...
摘要:使用來描述算法和數(shù)據(jù)結(jié)構(gòu)的教程很少,目前市面上用描述算法和數(shù)據(jù)結(jié)構(gòu)的書屈指可數(shù),并且就我看過的那本而言我只看過數(shù)據(jù)結(jié)構(gòu)與算法語言描述質(zhì)量實(shí)在堪憂。 使用JavaScript來描述算法和數(shù)據(jù)結(jié)構(gòu)的教程很少, 目前市面上用JS描述算法和數(shù)據(jù)結(jié)構(gòu)的書屈指可數(shù),并且就我看過的那本而言(我只看過《數(shù)據(jù)結(jié)構(gòu)與算法 JavaScript 語言描述》)質(zhì)量實(shí)在堪憂。碰巧有次看到Nicolas博客中的C...
摘要:棧被稱為一種后入先出的數(shù)據(jù)結(jié)構(gòu)。散列使用的數(shù)據(jù)結(jié)構(gòu)叫做散列表。這些操作需要求助于其他數(shù)據(jù)結(jié)構(gòu),比如下面介紹的二叉查找樹。 前言 在過去的幾年中,得益于Node.js的興起,JavaScript越來越廣泛地用于服務(wù)器端編程。鑒于JavaScript語言已經(jīng)走出了瀏覽器,程序員發(fā)現(xiàn)他們需要更多傳統(tǒng)語言(比如C++和Java)提供的工具。這些工具包括傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)(如鏈表,棧,隊(duì)列,圖等),...
摘要:與異步編程按照維基百科上的解釋獨(dú)立于主控制流之外發(fā)生的事件就叫做異步。因?yàn)榈拇嬖?,至少在被?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒。在握手過程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 1、前端 排序算法總結(jié) 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較...
閱讀 4195·2021-11-22 13:52
閱讀 2096·2021-09-22 15:12
閱讀 1135·2019-08-30 15:53
閱讀 3467·2019-08-29 17:12
閱讀 2198·2019-08-29 16:23
閱讀 1664·2019-08-26 13:56
閱讀 1781·2019-08-26 13:44
閱讀 1898·2019-08-26 11:56