轉載請注明出處 http://www.cnblogs.com/dongxiao-yang/p/6410775.html
參考引言:在排序算法中快速排序的效率是非常高的,但是還有種排序算法的效率可以與之媲美,那就是歸並排序;歸並排序和快速排序有那么點異曲同工之妙,快速排序:是先把數組粗略的排序成兩個子數組,然后遞歸再粗略分兩個子數組,直到子數組里面只有一個元素,那么就自然排好序了,可以總結為先排序再遞歸;歸並排序:先什么都不管,把數組分為兩個子數組,一直遞歸把數組划分為兩個子數組,直到數組里只有一個元素,這時候才開始排序,讓兩個數組間排好序,依次按照遞歸的返回來把兩個數組進行排好序,到最后就可以把整個數組排好序;
public class mergesortutil { public static void main(String[] args) { // TODO Auto-generated method stub int[] a = new int[] { 11,9,7,5,3,1,12,10,8,6,4,2 }; int[] tmp = new int[a.length]; mergesort(a,0,a.length-1,tmp); } private static void mergearray(int[] array, int start, int middle, int end,int[] tmp) { int first = start; int second = middle + 1; int index = start; while ((first <= middle) && (second <= end)) { if (array[first] >= array[second]) tmp[index++] = array[second++]; else tmp[index++] = array[first++]; } while (first <= middle) tmp[index++] = array[first++]; while (second <= end) tmp[index++] = array[second++]; for (first = start; first <= end; first++) array[first] = tmp[first]; System.out.println("merge is "+Arrays.toString(array)); } public static void mergesort(int[] array, int start, int end,int[] tmp) { if (start >= end) return; int middle = ((end + start) >> 1); mergesort(array, start, middle,tmp);// 遞歸划分左邊的數組 mergesort(array, middle + 1, end,tmp);// 遞歸划分右邊的數組 mergearray(array, start, middle, end,tmp);// 對有序的兩個數組進行合並成一個有序的數組 } }
程序調試輸出如下
merge is [9, 11, 7, 5, 3, 1, 12, 10, 8, 6, 4, 2]
merge is [7, 9, 11, 5, 3, 1, 12, 10, 8, 6, 4, 2]
merge is [7, 9, 11, 3, 5, 1, 12, 10, 8, 6, 4, 2]
merge is [7, 9, 11, 1, 3, 5, 12, 10, 8, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 12, 10, 8, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 10, 12, 8, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 6, 4, 2]
merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 4, 6, 2]
merge is [1, 3, 5, 7, 9, 11, 8, 10, 12, 2, 4, 6]
merge is [1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12]
merge is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
調試過程輸出結果有助於更好的理解排序過程,整個排序在數組划分到最小長度后不斷進行局部排序和局部合並排序,最終合並為全數組。
參考資料