歸併排序 迭代版
阿新 • • 發佈:2019-02-04
自學記錄
public class MergeSort { public static void main(String[] args){ int[] b={4,4,1,2,-9,10,101,2,23,9,-40,13,14,5,-8,2,1}; mergeSort(b); SortTest.show(b); } public static void mergeSort(int[] a){ int low,mid,high,step=1,len=a.length; //step不能大於等於區間長度,只能小於; while (step<len){ low=0;//從頭開始找 // low +step-1+1<=length-1,保證high存在,若連長度為到mid為1的high值都越界了,就不執行迴圈,例如 (0,1),(2,3),4 while (low+step<len){ mid=low+step-1; high=mid+step;//mid+1+step-1 if(high>len-1){ //high別越界了 high=len-1; } merge(a,low,mid,high); low=high+1; } step*=2;//一步兩,兩步四個... } } public static void merge(int[] arr, int low, int mid ,int high){ int i=low,j=mid+1,k=0; int[] temp = new int[high-low+1];//臨時矩陣; while (i<=mid && j<=high){ if(arr[i]<=arr[j]){ //比較大小; temp[k++]=arr[i++]; } else{ temp[k++]=arr[j++]; } } while(i<=mid){ temp[k++]=arr[i++];//把剩下的補齊 } while (j<=high){ temp[k++]=arr[j++]; } for(i=low,k=0;i<=high;i++,k++){ arr[i]=temp[k];//寫回去; } } }