在此示例中,我們將學(xué)習(xí)在Java中執(zhí)行合并排序算法。
在學(xué)習(xí)Java中的合并排序算法之前,請確保您了解合并排序算法的工作原理。
import java.util.Arrays;
//Java中的合并排序
class Main {
//將兩個(gè)子數(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];
}
//維護(hù)子數(shù)組和主數(shù)組的當(dāng)前索引
int i, j, k;
i = 0;
j = 0;
k = p;
//直到我們到達(dá)L或M的任一端,再選擇更大的一個(gè)
//元素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++;
}
// 當(dāng)L或M中的元素用完時(shí),
// 將其余元素并放入A[p..r]
while (i < n1) {
array[k] = L[i];
i++;
k++;
}
while (j < n2) {
array[k] = M[j];
j++;
k++;
}
}
// 將數(shù)組劃分為兩個(gè)子數(shù)組,對它們進(jìn)行排序并合并
void mergeSort(int array[], int left, int right) {
if (left < right) {
//m是數(shù)組被分成兩個(gè)子數(shù)組的點(diǎn)
int mid = (left + right) / 2;
//對每個(gè)子數(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)建一個(gè)未排序的數(shù)組
int[] array = { 6, 5, 12, 10, 9, 1 };
Main ob = new Main();
//調(diào)用方法mergeSort()
//傳遞參數(shù):數(shù)組、第一個(gè)索引和最后一個(gè)索引
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(jìn)行排序,則可以在merge()方法的第一個(gè)while循環(huán)內(nèi)將代碼更改為:
小于號改為大于
if (L[i] >= M[j]) {