合併排序的遞迴演算法
阿新 • • 發佈:2018-12-31
合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
合併排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。
將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。合併排序也叫歸併排序。
話不多說,上程式碼:
import java.util.Scanner;
//合併排序
public class Test10 {
public static void mergeSort(int a[], int left, int right) {
if (left < right) {// 至少有2個元素
int i = (left + right) / 2; // 取中點
mergeSort(a, left, i);
mergeSort(a, i + 1, right);
int b[]=new int[a.length];
merge(a, b, left, i, right); // 合併兩個排好序的陣列段到一個新的陣列b中
Copy(a, b, left, right); // 將合併後的陣列段再複製回陣列a中
}
}
public static void merge(int c[], int d[], int l, int m, int r) {
int i = l, j = m + 1, k = l;
while ((i <= m) && (j <= r))
if (c[i] <= c[j])
d[k++] = c[i++];
else
d[k++] = c[j++];
if (i > m)
for (int q = j; q <= r; q++)
d[k++] = c[q];
else
for (int q = i; q <= m; q++)
d[k++] = c[q];
}
public static void Copy(int a[], int b[], int m, int n) {
for (int i = m; i <= n; i++)
a[i] = b[i];
}
public static void main(String[] args) {
try {
System.out.println("排序的元素個數:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int list[] = new int[n];
System.out.println("依次輸入所有的元素:");
for (int i = 0; i <= list.length - 1; i++) {
list[i] = sc.nextInt();
}
mergeSort(list, 0, list.length-1);
for (int k = 0; k < list.length; k++) {
System.out.print(list[k] + " ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
執行結果:
其他語言的參考:
百度百科