1. 程式人生 > >分治法--合併排序

分治法--合併排序

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)