日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

归并排序(非递归,Java实现)

發布時間:2025/7/25 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 归并排序(非递归,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实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。