歸併排序:升序排java
private <T extends Comparable<? super T>> void mergeSortByAsc(T[] data, int low,int high) { T[] temp; /** 若是左右相等,則返回 */ if(low == high) return; /** 找到長度和中間的那個數*/ int size = high - low +1; int mid = (low + high)/2; temp = (T[])(new Comparable[size]); /** 對左邊的數據進行排序*/ mergeSort(data, low, mid); /** 對右邊的數據進行排序*/ mergeSort(data, mid + 1, high); /** copy 排序的數組*/ for(int i = 0;i < size; i++){ temp[i] = data[low + i]; } /** 合併兩個排序的數組*/ int left = 0; int right = mid - low + 1; for(int i = 0; i < size; i++){ if(right <= high - low){ if(left <= mid - low){ if(temp[left].compareTo(temp[right]) > 0){ data[i + low] = temp[right ++ ]; }else{ data[i + low] = temp[left ++]; } }else{ data[i + low] = temp[right ++ ]; } }else{ data[i + low] = temp[left ++]; } } }
降序排:數組
private <T extends Comparable<? super T>> void mergeSortByDesc(T[] data, int low,int high) { T[] temp; /** 若是左右相等,則返回 */ if(low == high) return; /** 找到長度和中間的那個數*/ int size = high - low +1; int mid = (low + high)/2; temp = (T[])(new Comparable[size]); /** 對左邊的數據進行排序*/ mergeSortByDesc(data, low, mid); /** 對右邊的數據進行排序*/ mergeSortByDesc(data, mid + 1, high); /** copy 排序的數組*/ for(int i = 0;i < size; i++){ temp[i] = data[low + i]; } /** 合併兩個排序的數組*/ int left = 0; int right = mid - low + 1; for(int i = 0; i < size; i++){ if(right <= high - low){ if(left <= mid - low){ if(temp[left].compareTo(temp[right]) < 0){ data[i + low] = temp[right ++ ]; }else{ data[i + low] = temp[left ++]; } }else{ data[i + low] = temp[right ++ ]; } }else{ data[i + low] = temp[left ++]; } } }