【DS】排序算法之歸併排序(Merge Sort)

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)。咱們只須要一個臨時數組在合併的時候保存數據便可。

相關文章
相關標籤/搜索