归并排序——排序算法
文章目錄
- 前言
- 一、歸并排序是什么?
- 二、算法描述
- 三、JS代碼實現
- 總結
前言
大家好,我又雙叒叕來周更我的博客了,雖然寫的內容并不是多么有用,但是也要記錄一下自己的技術生活,這周大周上了6天班,難得周日,雖然不想碰電腦,但是一但上手還是停不下來,總覺得不能只有工作,好歹也要有點自己的業余生活,寫博客也算是分享的生活的一種方式吧,不扯那么多了,還是老樣子,這周繼續更新一篇排序算法——歸并排序。
一、歸并排序是什么?
歸并排序(Merge Sort)是建立在歸并操作上的一種有效,穩定的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。
個人對于歸并排序的理解,就是先將序列不斷的二分為不可再分的序列,然后慢慢的兩兩合并,合并過程中進行排序,這樣不斷分下去又合并起來,就是典型的分治思想,每個子序列都是有序的,然后子序列再合并,直到還原為原來的序列,這樣就是歸并排序的思想,理解起來可能有點費勁,主要在遞歸這一塊千萬不要把自己套進去,你要理解遞歸的作用,而不是去人工機械的執行代碼,遞歸就是不斷分裂,最后又合并的過程,理解以后,就能明白子序列的合并過程,也就能理解歸并排序的思想了。
二、算法描述
算法步驟:
算法復雜度:
- 時間復雜度:
- 最好:O(nlog2n)
- 最壞:O(nlog2n)
- 平均: O(nlog2n)
- 空間復雜度:O(n)
- 穩定性:穩定
三、JS代碼實現
下面是JS代碼示例,可以在node環境運行代碼,查看結果。
代碼如下(示例):
function mergeSort(ary) {let len = ary.length;if (len < 2) {return ary;}let middle = Math.floor(len / 2);let left = ary.slice(0, middle);let right = ary.slice(middle);return merge(mergeSort(left), mergeSort(right)); }function merge(left, right) {var result = [];while (left.length > 0 && right.length > 0) {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; }let arr = [9, 8, 7, 3, 2, 1, 6, 5, 4, 0]; console.log(mergeSort(arr));運行結果圖:
總結
歸并排序其實也沒有那么難,可能一開始聽名字會被嚇到,感覺是一種很厲害的排序方法,所有排序方法其實都是一種對數據排序的思路,只要融匯貫通其排序的思想,至于用什么語言其實都一樣,主要還是要理解其中的算法思想,也只有貫通這種思路,才能在編程的過程中應用上,本質上來說,刷算法了解算法的思想,是在幫助程序員有更加縝密的邏輯思維,多了解算法能開闊寫程序的思路,多刷算法能讓自己的邏輯思維更加嚴謹,同時使用也是在掌握一種語言的熟練度。個人體會而言,就是在開發的過程中對于一些邊界的問題能考慮的更加細致,確保自己寫的程序萬無一失(當然是人就會寫出bug,所以還是要多多練習)。
—— 2021-1-17 23:15 苦逼打工人的自我催眠
今日份勵志名言:
理論再多,沒有行動仍將一事無成。 —— 恩格斯 · 共產主義理論家
總結
以上是生活随笔為你收集整理的归并排序——排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#实现语音合成功能
- 下一篇: NRF51822 Timer