1. 程式人生 > >一步一步搞清排序之歸併排序(JAVA)

一步一步搞清排序之歸併排序(JAVA)

前言:前面搞定了插入、冒泡、選擇···這些磨人的小妖精,這一次的目標是搞定歸併排序~歸併排序這個東東呢,演算法考試中有遇到過,當時並不能完整無誤的寫出來,學渣屬性曝光~~

原理:歸併排序是分治法-分而治之最經典的表達。
最基本的思想就是將兩個有序的序列合併為一個有序序列。
把一個長度為N的陣列,看成N個待合併的序列
第一步做兩兩合併,得到N/2個有序的序列
接下來兩兩合併上一步得到的有序序列,得到N/4個有序序列
繼續合併···
經過log N 次的歸併後,就得到了我們所需要的有序序列~

程式碼如下:

package zj.com.merge;

import java.util.Arrays;

public
class MergeSort { public void mergeSort(int[] a,int left,int right){ if(left<right) { int mid = (left+right)/2; mergeSort(a, left, mid); mergeSort(a, mid+1, right); merge(a, left, mid, right); } } public void merge
(int[] a,int left,int mid,int right){ /*temp作為臨時陣列順序儲存元素 * newindex 作為臨時陣列的下標指引 * copyindex 是將該段排序後的元素複製回原陣列的指引 * sepindex 是A、B兩個陣列後一個數組的第一個元素索引*/ int[] temp = new int[a.length]; int newindex = left; int copyindex = left; int sepindex = mid+1
; while(left<=mid&&sepindex<=right) { if(a[left]<=a[sepindex]) { //將較小的一個數放入臨時陣列中 temp[newindex] = a[left]; newindex++; left++; } else { temp[newindex] = a[sepindex]; newindex++; sepindex++; } } //若A、B陣列有一個已經全部放入臨時陣列,則剩下的不用比較直接放入 while(left<=mid) { temp[newindex++] = a[left++]; } while(sepindex<=right) { temp[newindex++] = a[sepindex++]; } //將臨時陣列中的元素按順序複製到原陣列 while(copyindex<=right) { a[copyindex] = temp[copyindex++]; } } public static void main(String[] args) { // TODO Auto-generated method stub MergeSort m = new MergeSort(); int[] a = {3,2,1,6,5,4,9,8,7,10,12}; m.mergeSort(a, 0, a.length-1); System.out.println(Arrays.toString(a)); } }