合併排序演算法解說與例子

2022-04-06 14:01:42 字數 1385 閱讀 4570

合併演算法採用分治法的思路,即問題劃分成n個規模較小而結構和原來問題相似的子問題,遞迴解決這些子問題,然後合併結果,最終得到原來問題的解。

合併演算法主要分為三個部分,第乙個部分是分解,將運來的問題分解成兩個包含n/2個元素的陣列的排序的問題,然後分別遞迴呼叫函式解決這兩個陣列的排序問題,最後一步,就是將已經排好序的陣列重新進行組合,使其成為按序排列的陣列。

這三步中**量較多的就是合併的**了,合併的問題其實我們也可以把它想象成把兩堆已經按從小到大的順序排好的撲克牌排成一堆撲克牌的問題,每次比較最上面的那個牌,小的就拿走放到輸出堆中,重複這個比較過程直到某一堆牌為空,然後把另外一堆牌直接放到輸出堆中這個比較過程就結束了,想清楚了了這個過程的話理解**就不難了。

//將兩個陣列按照順序重新進行排列

public static void merge(int rawarray, int firstindex, int middleindex, int lastindex)

for (int i = 0; i < secondarraycount; i++)

int firstarrayindex = 0;

int secondarrayindex = 0;

int rawarrayindex = firstindex;

//開始進行合併

//通過while條件判斷是否有陣列已經全部遍歷完畢,如果已經有乙個陣列輸出完畢那麼會跳出while迴圈

while (firstarrayindex < firstarraycount && secondarrayindex < secondarraycount)

else

}//跳出while迴圈後,這時有乙個陣列已經全部輸出完畢,由於另外乙個陣列一定是按大小排序的陣列,所以將剩下的元素直接迴圈賦值到原來的陣列中去\

while (firstarrayindex < firstarraycount)

while (secondarrayindex < secondarraycount)

}看懂了上面的合併,下面這個遞迴呼叫就沒什麼了,函式將陣列進行拆分,然後遞迴呼叫函式進行子陣列的排序,子陣列排序完成後呼叫合併函式將陣列進行合併。

///

///

///

///需要排序的陣列

///左邊界

///右邊界

public static void mergesort(int rawarray, int firstindex, int lastindex)

}合併排序體現的主要是乙個將問題進行拆分解決的思路,通過遞迴呼叫函式來解決子問題,最後合併結果,從而得到原問題的解。

身邊很多人在學資料結構和演算法的時候對演算法的語言有著特殊的要求,個人覺得學習演算法學習的是一種解決問題的思路,而不是具體的**實現,this is the point….

合併排序演算法

陣列ary的m個元素,ary p ary q ary q 1 ary r 已按曾序排序 使得ary p ary r 按曾序排列 void clibrary merge int ary,int p,int q,int r,int m else k 0 for i p i r i ary i bp k ...

合併排序演算法

主要思想 不斷將已經有序的子陣列a p.q 和a q 1.r 合併為新的有序的陣列a p.r 具體過程可如下操作 分解 將n個元素分成各含n 2個元素的子串行 解決 對兩個子陣列遞迴地排序 合併 合併兩個已經有序的子陣列得到最終的有序陣列。合併 歸併排序 分治策略 include include u...

合併排序演算法

合併排序是用分治策略實現的排序演算法之一。基本思想是 將待排序的元素分成大小大致相同的兩個子集合,分別對這兩個子集合進行排序,最後將排好序的子集合合併成所需要的集合。此方法的時間複雜度t n o nlogn 這種排序方法漸進最優演算法。合併排序 遞迴 include using namespace ...