1. 程式人生 > >合併排序的遞迴演算法

合併排序的遞迴演算法

合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(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(); } } }

執行結果:
這裡寫圖片描述
其他語言的參考:
百度百科

這裡寫圖片描述這裡寫圖片描述