圖解排序演算法(四)之歸併排序
阿新 • • 發佈:2018-12-31
package sortdemo; import java.util.Arrays; /** * Created by chengxiao on 2016/12/8. */ public class MergeSort { public static void main(String []args){ int []arr = {9,8,7,6,5,4,3,2,1}; sort(arr); System.out.println(Arrays.toString(arr)); } public staticvoid sort(int []arr){ int []temp = new int[arr.length];//在排序前,先建好一個長度等於原陣列長度的臨時陣列,避免遞迴中頻繁開闢空間 sort(arr,0,arr.length-1,temp); } private 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);//右邊歸併排序,使得右子序列有序 merge(arr,left,mid,right,temp);//將兩個有序子數組合並操作 } } private static void merge(int[] arr,int left,int mid,int right,int[] temp){ int i = left;//左序列指標 int j = mid+1;//右序列指標 int t = 0;//臨時陣列指標 while (i<=mid && j<=right){ if(arr[i]<=arr[j]){ temp[t++] = arr[i++]; }else { temp[t++] = arr[j++]; } } while(i<=mid){//將左邊剩餘元素填充進temp中 temp[t++] = arr[i++]; } while(j<=right){//將右序列剩餘元素填充進temp中 temp[t++] = arr[j++]; } t = 0; //將temp中的元素全部拷貝到原陣列中 while(left <= right){ arr[left++] = temp[t++]; } } }