1、算法思想算法
歸併排序是創建在歸併操做上的一種有效的排序算法。該算法是採用分治法的一個很是典型的應用,指的是將兩個已經排序的序列合併成一個序列的操做。其歸併思想以下:數組
1)申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列;
2)設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;
3)比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置;
4)重複步驟3直到某一指針達到序列尾;
5)將另外一序列剩下的全部元素直接複製到合併序列尾;函數
在使用歸併排序算法的時候,算法以下:性能
1)將序列切分,直至切分到序列是有序的(這裏經過將序列切分紅單個元素達到目的);spa
2)將序列塊兩兩歸併成較大的序列塊;指針
3)將較大的序列塊再度歸併,不斷繼續,直至歸併造成和原始序列一樣大小的序列;code
2、算法示意圖blog
如圖所示,首先第一行表示待排序的序列,第一步就是將序列元素切割爲一個個的獨立元素(表示有序序列),接着將相鄰的兩個元素按照歸併思想合併成第二行,一樣顏色的元素屬於一組,接着再次歸併,造成第三行的樣子。接着將兩組歸併,就能夠造成最後一行已經排好序的樣子。排序
3、Java代碼遞歸
1 public class MergeSort extends Sort { 2 public static void sort(int[] array) { 3 int[] tempArray = new int[array.length]; 4 mergeSort(array, tempArray, 0, array.length - 1); 5 printArray(array); 6 } 7 8 private static void mergeSort(int[] array, int[] tempArray, int left, int right ) { 9 if ( left < right ) { 10 int center = ( left + right ) / 2; 11 mergeSort(array, tempArray, left, center); 12 mergeSort(array, tempArray, center + 1, right); 13 merge(array, tempArray, left, center + 1, right); 14 } 15 } 16 17 private static void merge( int[] array, int[] tempArray, int left, int right, int end) { 18 int tempLeft = left; 19 int tempRight = right; 20 int position = left; 21 22 while(tempLeft < right && tempRight <= end){//兩個隊列都沒到頭 23 if(array[tempLeft] < array[tempRight]) 24 tempArray[position++] = array[tempLeft++]; 25 else 26 tempArray[position++] = array[tempRight++]; 27 } 28 29 while(tempLeft < right){ 30 tempArray[position++] = array[tempLeft++]; 31 } 32 33 while(tempRight <= end){ 34 tempArray[position++] = array[tempRight++]; 35 } 36 37 for(int index = left; index <= end; index++){//複製回去 38 array[index] = tempArray[index]; 39 } 40 } 41 }
算法的精華在於函數mergeSort,這是一個遞歸算法,從第9行能夠看出來,數組首先被切成單個單個的元素,而後再歸併。第11~13行首先對左半部分進行歸併排序,而後對右半部分進行歸併排序,最後總體歸併。
4、算法複雜度
這裏的分析和快速排序一致,同時,因爲它是均分,不會出現和快速排序那樣分裂開來的序列不均勻致使的性能差別。咱們由函數mergeSort可知,T(n)=O(nlogn)。
由上面的實現代碼可知,其空間複雜度爲O(n)。咱們只須要一個臨時數組在合併的時候保存數據便可。