一:
合並排序(MERGE SORT)是又一類不同的排序方法,合並的含義就是將兩個或兩個以上的有序數據序列合並成一個新的有序數據序列,因此它又叫歸並算法。它的基本思想就是假設數組A有N個元素,那么可以看成數組A是又N個有序的子序列組成,每個子序列的長度為1,然后再兩兩合並,得到了一個 N/2 個長度為2或1的有序子序列,再兩兩合並,如此重復,值得得到一個長度為N的有序數據序列為止,這種排序方法稱為2—路合並排序。
例如數組A有7個數據,分別是: 49 38 65 97 76 13 27,那么采用歸並排序算法的操作過程如圖7所示:
初始值 [49] [38] [65] [97] [76] [13] [27]
看成由長度為1的7個子序列組成
第一次合並之后 [38 49] [65 97] [13 76] [27]
看成由長度為1或2的4個子序列組成
第二次合並之后 [38 49 65 97] [13 27 76]
看成由長度為4或3的2個子序列組成
第三次合並之后 [13 27 38 49 65 76 97]
合並算法的核心操作就是將一維數組中前后相鄰的兩個兩個有序序列合並成一個有序序列。合並算法也可以采用遞歸算法來實現,形式上較為簡單,但實用性很差。合並算法的合並次數是一個非常重要的量,根據計算當數組中有3到4個元素時,合並次數是2次,當有5到8個元素時,合並次數是3次,當有9到16個元素時,合並次數是4次,按照這一規律,當有N個子序列時可以推斷出合並的次數是X(2 >=N,符合此條件的最小那個X)。
其時間復雜度為:O(nlogn).所需輔助存儲空間為:O(n)
二:實現歸並排序
public class 歸並排序 { public static void main(String[] args) { int arr[]={49,38, 65,97,76,13,27}; int temp[]=new int[arr.length]; Sort(arr,0,arr.length-1,temp); System.out.println(Arrays.toString(arr)); } //分合 static void Sort(int []arr,int left,int right,int []temp){ if(left<right){ int mid=(left+right)/2; Sort(arr,left,mid,temp); Sort(arr,mid+1,right,temp); bing(arr,left,mid,right,temp); } } //合並方法 static void bing(int[] arr,int left,int mid,int right,int[]temp){ //初始化i,左邊有序序列的初始索引 int i=left; //初始化j,右邊有序序列的初始索引 int j=mid+1; //指向temp數組的當前索引 int t=0; while (i<=mid&&j<=right){ //9 if(arr[i]<=arr[j]){ temp[t]=arr[i]; t+=1; i+=1; }else { temp[t]=arr[j]; t+=1; j+=1; } } //將左邊剩余的數據依次填充到temp while (i<=mid){ temp[t]=arr[i]; t+=1; i+=1; } //將右邊剩余的數據依次填充到temp while (j<=right){ temp[t]=arr[j]; t+=1; j+=1; } //將temp數組的元素拷貝到arr t=0; int tempLeft=left; while (tempLeft<=right){ arr[tempLeft]=temp[t]; t+=1; tempLeft+=1; } } }