歸併排序詳細分析

2021-10-02 06:49:13 字數 2076 閱讀 7499

通過定義兩個儲存空間,第乙個儲存空間為使用者輸入的陣列段。在第乙個儲存空間中每次分組比較,然後將結果排入第二個儲存空間中。週期結束後兩個儲存空間交換。

​ 從菜鳥教程學習的這個演算法,菜鳥教程中歸併排序有兩個實現方法:乙個是迭代,乙個是遞迴。這裡我主要針對迭代分析。

void merge_sort(int arr, int len)

int* temp = a;

a = b;

b = temp;

} if (a != arr)

free(b);

}

​ 在本程式中用到了兩個儲存空間,乙個是arr陣列本身,用指標a指向了這個陣列。另外使用stdlib標頭檔案中的malloc函式分配一塊和arr陣列等大的空間,用指標b指向了這個位址。這裡要注意的是,a指標和b指標指向不同的位址。

​ 接著通過定義seg變數來設定a中兩個資料段的間隔。然後使用兩個變數,這裡簡寫為s1和s2去分別遍歷這兩個資料段。low,mid,high可以成乙個遍歷區間:

[ lo

w,mi

d)∪[

mid,

high

)[low,mid)∪[mid,high)

[low,m

id)∪

[mid

,hig

h)​ 左邊的區間由s1去遍歷,右邊s2遍歷。然後比較這兩個位置中數的大小。使用復合公式,如果s1>s2,返回s1的值,直接寫入到b的位址中去。同時本次比較有返回數的這個區間(這裡為s1)的陣列下標自加1,實現往右移動一位的效果。而另一邊的語句則不會執行。這樣反覆計算最終會有乙個值無數比較,通過下面兩個while語句來直接填入資料段後。然後接著一直迴圈直到第一組遍歷結束。

​ 第一組遍歷結束後會得到乙個整理後的陣列,但是儲存在b的位址中。而我們需要它返回到a的位址當中,就進行兩個指標指向的位址進行交換。但是這樣交換指標指向位址,如果在陣列成員為奇數個的時候則會造成最終b拿到了arr的位址,a拿到了動態分配的位址。導致最後釋放b的時候會出錯。這時候最外層的if語句判斷指標指向位址就起到了作用。

​ 第乙個週期結束後緊接著開始第二個週期,seg間隔成冪次增長。間隔會從1到2到4這樣增長,而每個週期中arr陣列中資料段的遍歷長度就是:seg/2。

​ 最終就能夠得到乙個排序後的序列。

迭代法模擬圖:

遞迴法的思路和迭代法相反。遞迴法首先會把arr拆分成s1,s2兩段,然後再把s1和s2繼續再拆一次。一直拆成零散的幾段,然後進行比較,然後排序。

c程式實現:

void merge_sort_recursive(int arr, int reg, int start, int end)
就像名字那樣,這個方法的核心就是遞迴。

​ 遞迴法首先要求使用者輸入兩個陣列,這和迭代法差不多。其次輸入起始位址和結束位址(這並不是遞迴排序必須的,只是這個程式這麼寫而已。)

​ 首先明確一點:遞迴呼叫了這個函式本身,包含了這個函式中所有的指令。明確了這點後我們可以往下模擬分析了。

​ 我們不妨把遞迴看成巢狀中的巢狀,根據這段程式中的作用,俗稱挖坑吧。

​ 首先遞迴法會把一段資料從中間分開,設定起始位址和結束位址,接著呼叫本身。這時候這乙個坑就停止了,程式跑去挖下乙個坑了,就這樣一直一直挖下去。直到挖到每個坑里只有兩個成員,s1和s2,然後從最後那個坑開始填,返回s1和s2到reg陣列,然後把reg同步到arr裡。這個坑填完了又接著填上乙個坑,就這樣慢慢填到最外層的坑。最後一同步,就得到了乙個有序陣列。

不妨看看這張圖,很直觀:

不得不說,

​ 剛學這個覺得還是有一些難度的,果然想寫程式邏輯思維很重要呀。

宣告

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...