遞迴演算法學習(歸併排序)

2021-06-21 16:53:46 字數 1269 閱讀 4367

歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為:

1)劃分子表

2)合併半子表 

首先我們來討論歸併演算法,歸併演算法將一系列資料放到乙個向量中,索引範圍為[first,last],這個序列由兩個排好序的子表構成,以索引終點(mid)為分界線,以下面乙個序列為例

7,10,19,25,12,17,21,30,48

這樣的乙個序列中,分為兩個子串行 7,10,19,25  和 12,17,21,30,48,如下圖所示:

再使用歸併演算法的時候的步驟如下:

第一步:比較v[indexa]=7和v[indexb]=12,將較小的v[indexa]取出來放到臨時向量temparray中,然後indexa加1

第二步:比較v[indexa]=10和v[indexb]=12,將較小的10放到臨時變數temparray中,然後indexa++;

第三步:比較v[indexa]=19與v[indexb]=12,將較小的12存放到臨時變數temparray中,然後indexb++;

第四步到第七步:按照以上規則,進行比對和儲存,得到如下結果:

最後一步:將子表b中剩餘項新增到臨時向量temparray中

然後將臨時變數中的值按照索引位置,拷貝回向量v中,就完成了對向量v的歸併排序

演算法函式為:

public void merger(int v, int first, int mid, int last)

else }

//複製沒有比較完子表中的元素

while (indexa < mid)

while (indexb < last)

int index = 0;

while (tempv.count > 0) }

實現歸併排序;歸併排序演算法分為兩步,第一步:先將原來的資料表分成排好序的子表,然後呼叫 merger  對子表進行歸併,使之成為有序表,例如有如下向量:

25,10,7,19,3,48,12,17,56,30,21

對此序列進行歸併排序的步驟為:

歸併演算法函式為

public void mergersort(int v, int first, int last) }

歸併演算法的劃分子表和歸併子表與原資料序列次序無關,因此演算法的最壞情況,最壞情況和平均情況時間複雜度是一樣的

下面是歸併演算法的函式呼叫圖

示例程式: /files/jillzhang/mergersort.rar

演算法學習 10 遞迴 之歸併排序

package com.tw.dst.recursive 演算法學習 遞迴 概念介紹 歸併排序 歸併演算法的中心是歸併兩個已經有序的陣列,並且遞迴呼叫歸併操作。歸併排序優點和缺點 比簡單排序在速度上快很多 歸併排序會占用雙倍的儲存空間。歸併排序的效率 歸併排序的時間複雜度是 o n logn 簡單排...

排序演算法學習 歸併排序

歸併排序 merge sort 採用分治思想,將排序的過程分成乙個個子過程,當所有子過程完成時,排序也最終完成了。而歸併排序是將陣列不斷地二分,進而形成乙個個子過程。子過程,即歸併的過程如下圖演示,需要額外開闢一片空間進行複製乙份原陣列,然後兩邊逐一進行比較後進行歸併。至於它的時間複雜度,我們可以看...

演算法學習筆記 歸併排序

歸併排序 一種簡單的利用遞迴排序的演算法,將乙個陣列先 遞迴地 將它分成兩半分別排序,然後將兩半分別排序,然後將結果歸併起來。原地歸併的抽象方法 public static void merge int a,int lo,int mid,int hi 歸併回a lo.hi for int k lo ...