在此示例中,我們將學習在Java中執(zhí)行合并排序算法。
在學習Java中的合并排序算法之前,請確保您了解合并排序算法的工作原理。
import java.util.Arrays; //Java中的合并排序 class Main { //將兩個子數(shù)組L和M合并為數(shù)組 void merge(int array[], int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int L[] = new int[n1]; int M[] = new int[n2]; //填充左右數(shù)組 for (int i = 0; i < n1; i++){ L[i] = array[p + i]; } for (int j = 0; j < n2; j++){ M[j] = array[q + 1 + j]; } //維護子數(shù)組和主數(shù)組的當前索引 int i, j, k; i = 0; j = 0; k = p; //直到我們到達L或M的任一端,再選擇更大的一個 //元素L和M,并將它們放置在A[p..r]處的正確位置。 //降序排序 //使用 if(L[i] >= <[j]) while (i < n1 && j < n2) { if (L[i] <= M[j]) { array[k] = L[i]; i++; } else { array[k] = M[j]; j++; } k++; } // 當L或M中的元素用完時, // 將其余元素并放入A[p..r] while (i < n1) { array[k] = L[i]; i++; k++; } while (j < n2) { array[k] = M[j]; j++; k++; } } // 將數(shù)組劃分為兩個子數(shù)組,對它們進行排序并合并 void mergeSort(int array[], int left, int right) { if (left < right) { //m是數(shù)組被分成兩個子數(shù)組的點 int mid = (left + right) / 2; //對每個子數(shù)組的遞歸調(diào)用 mergeSort(array, left, mid); mergeSort(array, mid + 1, right); //合并已排序的子數(shù)組 merge(array, left, mid, right); } } public static void main(String args[]) { //創(chuàng)建一個未排序的數(shù)組 int[] array = { 6, 5, 12, 10, 9, 1 }; Main ob = new Main(); //調(diào)用方法mergeSort() //傳遞參數(shù):數(shù)組、第一個索引和最后一個索引 ob.mergeSort(array, 0, array.length - 1); System.out.println("排序后的數(shù)組:"); System.out.println(Arrays.toString(array)); } }
輸出1
未排序的數(shù)組: [6, 5, 12, 10, 9, 1] 排序后的數(shù)組: [1, 5, 6, 9, 10, 12]
在此,數(shù)組的元素以升序排序。如果要按降序?qū)υ剡M行排序,則可以在merge()方法的第一個while循環(huán)內(nèi)將代碼更改為:
小于號改為大于 if (L[i] >= M[j]) {