归并排序(非递归,Java实现)
生活随笔
收集整理的這篇文章主要介紹了
归并排序(非递归,Java实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歸并排序(非遞歸):自底向上
public class MergeSort {/*** @param arr 待排序的數組* @param left 本次歸并的左邊界* @param mid 本次歸并的中間位置,也就是分界線* @param right 本次歸并的右邊界* @param <T> 泛型* @local aux 輔助空間(Auxiliary Space)*/private static <T extends Comparable<? super T>> void merge(T[] arr, int left, int mid, int right) {T[] aux = java.util.Arrays.copyOfRange(arr, left, right + 1);int i = left;int j = mid + 1;for (int t = left; t <= right; t++) {if (i > mid) {arr[t] = aux[j++ - left];} else if (j > right) {arr[t] = aux[i++ - left];} else if (aux[i - left].compareTo(aux[j - left]) < 0) {arr[t] = aux[i++ - left];} else {arr[t] = aux[j++ - left];}}}public static <T extends Comparable<? super T>> void sort(T[] arr, int left, int right) {int n = arr.length;for (int size = 1; size < n; size *= 2) {for (int i = 0; i < n - size; i += size * 2) {merge(arr, i, i + size - 1, Math.min(i + 2 * size - 1, n - 1));}}}public static <T extends Comparable<? super T>> void sort(T[] arr) {sort(arr, 0, arr.length - 1);}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3 5 1 7 2 9 8 0 4 6sort(arr);printArr(arr);//0 1 2 3 4 5 6 7 8 9} }歸并排序(非遞歸)優化:merge前判斷是否有必要進行歸并
public class MergeSort {/*** @param arr 待排序的數組* @param left 本次歸并的左邊界* @param mid 本次歸并的中間位置,也就是分界線* @param right 本次歸并的右邊界* @param <T> 泛型* @local aux 輔助空間(Auxiliary Space)*/private static <T extends Comparable<? super T>> void merge(T[] arr, int left, int mid, int right) {T[] aux = java.util.Arrays.copyOfRange(arr, left, right + 1);int i = left;int j = mid + 1;for (int t = left; t <= right; t++) {if (i > mid) {arr[t] = aux[j++ - left];} else if (j > right) {arr[t] = aux[i++ - left];} else if (aux[i - left].compareTo(aux[j - left]) < 0) {arr[t] = aux[i++ - left];} else {arr[t] = aux[j++ - left];}}}public static <T extends Comparable<? super T>> void sort(T[] arr, int left, int right) {int n = arr.length;for (int size = 1; size < n; size *= 2) {for (int i = 0; i < n - size; i += size * 2) {if (arr[i + size - 1].compareTo(arr[i + size]) > 0) {merge(arr, i, i + size - 1, Math.min(i + 2 * size - 1, n - 1));}}}}public static <T extends Comparable<? super T>> void sort(T[] arr) {sort(arr, 0, arr.length - 1);}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3 5 1 7 2 9 8 0 4 6sort(arr);printArr(arr);//0 1 2 3 4 5 6 7 8 9} }遞歸排序(非遞歸)繼續優化:對小規模數據使用插入排序
歸并排序是對一組一組的數據進行歸并。當這一組中的數很少時(暫定為4),使用插入排序。
public class MergeSort {/*** @param arr 待排序的數組* @param left 本次歸并的左邊界* @param mid 本次歸并的中間位置,也就是分界線* @param right 本次歸并的右邊界* @param <T> 泛型* @local aux 輔助空間(Auxiliary Space)*/private static <T extends Comparable<? super T>> void merge(T[] arr, int left, int mid, int right) {T[] aux = java.util.Arrays.copyOfRange(arr, left, right + 1);int i = left;int j = mid + 1;for (int t = left; t <= right; t++) {if (i > mid) {arr[t] = aux[j++ - left];} else if (j > right) {arr[t] = aux[i++ - left];} else if (aux[i - left].compareTo(aux[j - left]) < 0) {arr[t] = aux[i++ - left];} else {arr[t] = aux[j++ - left];}}}private static <T extends Comparable<? super T>> void insertionSort(T[] arr, int left, int right) {for (int i = left + 1; i <= right; i++) {T temp = arr[i];int j = i - 1;while (j >= left && temp.compareTo(arr[j]) < 0) {arr[j + 1] = arr[j];j--;}arr[j + 1] = temp;}}public static <T extends Comparable<? super T>> void sort(T[] arr, int left, int right) {int len = arr.length;int smallSize = 4;//當規模小于4時采用插入排序for (int i = 0; i < len; i += smallSize) {insertionSort(arr, i, Math.min(i + smallSize - 1, len - 1));}for (int size = smallSize; size < len; size *= 2) {for (int i = 0; i < len - size; i += size * 2) {if (arr[i + size - 1].compareTo(arr[i + size]) > 0){merge(arr, i, i + size - 1, Math.min(i + 2 * size - 1, len - 1));}}}}public static <T extends Comparable<? super T>> void sort(T[] arr) {sort(arr, 0, arr.length - 1);}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3 5 1 7 2 9 8 0 4 6sort(arr);printArr(arr);//0 1 2 3 4 5 6 7 8 9} }
轉載于:https://www.cnblogs.com/noKing/p/7944804.html
總結
以上是生活随笔為你收集整理的归并排序(非递归,Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VIM - 每行前或者每行后增加相同的字
- 下一篇: FastDFS FAQ (欢迎反馈,我将