1. 程式人生 > >Day1:歸併排序

Day1:歸併排序

歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

 

 

程式碼實現:


public class bbb2 {
	public static int[] sort(int array[],int low,int high)
	{
		int mid=(high+low)/2;
		if(low<high)
		{
			sort(array,low,mid);
			sort(array,mid+1,high);
			merge(array,low,mid,high);
		}
		return array;
	}
	
	private static void merge(int[] array, int low, int mid, int high) {
		int temp[]=new int [high-low+1];/*為什麼加1?因為等下引數輸入的時候high是length-1(因為比如lenth=10的時候末尾位置是9),而這裡是新建一個數組,長度應該和array相等,所以應該是high-low+1而不是high-low*/
		//設定臨時變數儲存分割成的兩端陣列的頭標
		int i=low;
		int j=mid+1;
		int k=0;//這個是給temp用的
		//從小到大排序
		while(i<=mid&&j<=high)
		{
			if(array[i]<array[j])
				temp[k++]=array[i++];
			else
				temp[k++]=array[j++];
		}
		//把array[i]裡面剩下的加入temp
		while(i<=mid)
		{
			temp[k++]=array[i++];
		}
		//把array[j]裡面剩下的加入temp
		while(j<=high)
		{
			temp[k++]=array[j++];
		}
		//把temp裡面的重新匯入array
		for(int m=0;m<array.length;m++)
		{
			array[m+low]=temp[m];//為什麼是array[m+low]而不是array[m]?因為對於sort(array,mid+1,high)來說,他的low是mid+1,如果用array[m]的話,那這半邊就加入不了了。
		}		
	}
	public static void main(String[] args) {
		int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 }; 
		bbb.sort(nums, 0, nums.length-1);
		System.out.println(Arrays.toString(nums));
	}
}

執行結果: