分治法--合併排序
阿新 • • 發佈:2019-02-14
package com.duoduo.day316; /** * 合併排序 * 分解 ----治理----合併 * @author 多多 * */ import java.util.Scanner; public class MergeSort { public static void main(String [] args) { Scanner sc=new Scanner(System.in); System.out.println("請輸入數列中的元素個數:"); int n=sc.nextInt(); int [] arr=new int[n]; System.out.println("請依次輸入數列中的元素:"); for(int i=0;i<n;i++) { arr[i]=sc.nextInt(); } mergeSort(arr,0,n-1); //分解 System.out.println("合併排序結果:"); for(int i=0;i<n;i++) { System.out.print(arr[i]+" "); } } /*合併兩個子序列*/ public static void merge(int [] arr,int low, int middle,int high) { int [] B=new int[high-low+1]; //建立輔助陣列 存放排序後的陣列元素 int i = low; //i從low 開始,不一定是0 int j=middle+1; int k=0; //定義指向兩個子序列和輔助陣列的指標 while(i<=middle && j<=high) { //分別指向兩個子序列 if(arr[i]<=arr[j]) { //比較當前指向元素的大小,將小值存放在B中兵依次移動對應指標 B[k++]=arr[i++]; }else { B[k++]=arr[j++]; } } //當有一個子序列元素存放完畢後 將另一子序列元素按序存入B中 while(i<=middle) B[k++]=arr[i++]; while(j<=high) B[k++]=arr[j++]; //B陣列存放排好序的所有元素 將其內容複製給原arr陣列 for(i=low,k=0;i<=high;i++) arr[i]=B[k++]; } /*遞迴形式的合併排序演算法*/ public static void mergeSort(int [] arr, int low,int high) { if(low<high) { int middle=low+((high-low)>>1); mergeSort(arr,low,middle); //分解成兩個子序列 並分別合併排序 mergeSort(arr,middle+1,high); merge(arr,low,middle,high); //將兩個子序列合併起來 } } }
時間複雜度:
分解 O(1)
解決子問題:遞迴2T(n/2)
合併O(n)
總:T(n)=2T(n/2)+O(n)------O(nlogn)
空間複雜度:
輔助陣列 O(n)
遞迴呼叫棧空間 (即遞迴樹的深度)O(logn)