合并排序的递归算法

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

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

这里写图片描述这里写图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aotulive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值