排序之歸併排序

2021-10-09 21:48:11 字數 1363 閱讀 7849

歸併排序還是有點雲裡霧裡(尤其是遞迴的時候的狀態樹與函式呼叫時的棧的狀態不太清楚,需要寫**加斷點做測試),先記錄下來,後面有時間再弄,先查到乙個用斷點測試後,描述歸併排序時遞迴狀態樹的部落格:其實如果按照《極客大學》演算法訓練營的覃超老師講的分治的模板,應該比較好寫出來:

分治的模板:

int divide_conquer(problem *problem, int params) 

//divide

subproblem = split_problem(problem, data);

subresult1 = divide_conquer(subproblems[0], p1);

subresult2 = divide_conquer(subproblems[1], p1);

subresult3 = divide_conquer(subproblems[2], p1);

..............................................

//merge

result = merge(subresult1, subresult2, subresult3,...);

return 0;

}

下面是歸併排序的遞迴寫法:

templatevoid merge_sort_recursive(t arr, t reg, int start, int end) 

// divide

int len = strat - end, mid = (len >> 1) + start;

int start1 = start, end1 = mid;

int start2 = mid + 1, end2 = end;

merge_sort(arr, reg, start1, end1); // subproblem1

merge_sort(arr, reg, start2, end2); // subproblem2

// merge

int k = start;

while (start1 <= end1 && start2 <= end2)

// 將剩餘部分直接複製到reg末尾,因為上面這個while已經將子部分合併好了,剩餘不滿足條件的必定有乙個是先到達了邊界,另乙個剩餘部分一定是有序的

while (start1 <= end1)

while (start2 <= end1)

for (k = start; k <= end; k++)

}// merge_sort

templatevoid merge_sort(t arr, const int len)

排序之歸併排序

歸併排序和快速排序的思想一樣,都是依據分治法 遞迴 兩者不同的是,歸併需要對子問題的解進行合併,即合併兩個已排序的表,合併的時間為線性的,最多進行了n 1次比較,其中n是元素的總數。歸併排序的基本思路就是將陣列分成二組a和b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。如...

排序之歸併排序

歸併排序演算法思想 分而治之 divide conquer 每個遞迴過程涉及兩個步驟 第一,分解 把待排序的 n 個元素的序列分解成兩個子串行,每個子串行包括 n 2 個元素.第二,合併 合併兩個排好序的子串行,生成排序結果.第一步 public static void mergeinternal ...

排序之歸併排序

package mergesort import shellsort.shellsort import choosesort.example 歸併排序 歸併的含義 將兩個有序的陣列合併成乙個有序陣列 思想 通過遞迴的方法,將陣列不斷地分割,直到陣列裡只有乙個元素時返回。然後1 1歸併 2 2歸併 4...