天天看點

排序算法之歸并排序(JAVA)

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

      1)劃分子表

      2)合并半子表 

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

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

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

排序算法之歸并排序(JAVA)

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

排序算法之歸并排序(JAVA)

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

排序算法之歸并排序(JAVA)

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

排序算法之歸并排序(JAVA)
排序算法之歸并排序(JAVA)
排序算法之歸并排序(JAVA)

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

java代碼實作:

所有函數共用一個臨時數組temp,每次都new一個臨時數組開銷太大

參考文章:

<a href="http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html" target="_blank">http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html</a>

<a href="http://blog.csdn.net/morewindows/article/details/6678165/" target="_blank">http://blog.csdn.net/morewindows/article/details/6678165/</a>