歸併排序是乙個o(nlogn)的演算法,基本思想就是乙個分治策略,先進行劃分,然後再進行合併,下面舉個例子。有這樣一組資料:
如果對它進行歸併排序的話,首先將它從中間分開,這樣,它就被分成了兩個陣列:
與 對這兩個陣列,也分別進行這樣的操作,逐步的劃分,直到不能再劃分為止(每個子陣列只剩下乙個元素),這樣,劃分的過程就結束了。
劃分的過程如下圖所示:
接下來,我們進行歸併操作,依照上圖,劃分過程是從上到下進行的,而歸併的過程是從下往上進行的,例如上圖中,最下層,這兩個陣列,如果按公升序排列,將他們合併後的陣列就是。,這兩個子陣列合併後是。而與,這兩個陣列同屬乙個分支,他們也需要進行合併,由於這兩個子陣列本身就是有序的,所以合併的過程就是,每次從待合併的兩個子陣列中選取乙個最小的元素,然後把這個元素放到合併後的陣列中,前面兩個陣列合併後就是。依次類推,直到合併到最上層結束,這是資料的排序已經完成了。
歸併的過程如下圖所示。這個過程是從下往上的。
它是乙個在效率上高於一般排序的演算法.一般排序:冒泡, 插入, 選擇排序的時間複雜度為o(n^2), 而歸併排序的時間複雜度為o(n*log n),如果n(及排序項的數目)是10000.那麼n^2就是100000000, 而n * log n則是40000. 也就是如果這個數量的資料.如果用歸併排序需要40s的時間,那麼用插入排序則需要28個小時.
歸併排序演算法的核心:
核心思想就是分治演算法.先進行劃分,再進行排序歸併.歸併兩個有序的陣列.即歸併兩個有序的陣列a和b,然後就有了包含這兩個新陣列的陣列c.
即一次拿出a和b的陣列項進行比較.小的就插入到新容器c中.直到一方已經插入完畢.如果另一方還有剩餘那麼就表示剩餘的是有序的而且比較大的.那麼就直接連線到c陣列容易的後面即可.
**:
JS歸併排序
var arr 49,38,65,97,76,13,27,49 console.log mergesort arr function merge left,right return tmp.concat left,right function mergesort a 這段合併排序的 相當簡單直觀,但...
歸併排序(JS)
歸併排序 js jane 96 2019 03 25 19 10 49 4365 收藏 1 展開歸併排序 從小到大 演算法複雜度 最好情況 o nlogn 最壞情況 o nlogn 平均情況 o nlogn 空間複雜度 o n 穩定性 穩定 function mergesort arr,start,...
Js 排序演算法 歸併排序
將兩個或兩個以上的有序序列合併成乙個有序序列過程 以二路歸併為例 穩定的排序方法 遞迴演算法 歸併排序 二路歸併 function msort record,newrecord,s,t else console.log record return newrecord function merge r...