合并排序的递归算法

合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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();
        }
    }
}

运行结果:
这里写图片描述
其他语言的参考:
百度百科

合并排序的递归算法_第1张图片合并排序的递归算法_第2张图片

你可能感兴趣的:(算法设计与分析,Java)