归并排序(java实现)

一、基本概念

归并排序是将两个有序序列合并成一个有序序列的过程。归并排序

二、排序过程:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

  4. 重复步骤3直到某一序列的指针达到序列尾

  5. 将另一序列剩下的所有元素直接复制到合并序列尾,一次归并结束


三、相关代码

package com.lte;

import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {
        int[] a = { 57, 68, 59, 52, 72, 28, 96, 33 };
        sort(a, 0, a.length - 1);
    }

    public static void sort(int[] a, int left, int right) {
        if (left >= right)
            return;
        int center = (left + right) >> 1;
        sort(a, left, center);
        sort(a, center + 1, right);
        merge(a, left, center, right);
    }

    public static void merge(int[] data, int left, int center, int right) {
        int[] tmpArr = new int[right + 1];
        int mid = center + 1;
        int index = left; // index记录临时数组的索引
        int tmp = left;

        // 从两个数组中取出最小的放入中临时数组中
        while (left <= center && mid <= right) {
            tmpArr[index++] = (data[left] <= data[mid]) ? data[left++]
                    : data[mid++];
        }
        // 剩余部分依次放入临时数组
        while (mid <= right) {
            tmpArr[index++] = data[mid++];
        }
        while (left <= center) {
            tmpArr[index++] = data[left++];
        }
        // 将临时数组中的内容复制回原数组
        for (int i = tmp; i <= right; i++) {
            data[i] = tmpArr[i];
        }
        System.out.println(Arrays.toString(data));
    }
}
复制代码

运行结果:

复制代码
[57, 68, 59, 52, 72, 28, 96, 33]
[57, 68, 52, 59, 72, 28, 96, 33]
[52, 57, 59, 68, 72, 28, 96, 33]
[52, 57, 59, 68, 28, 72, 96, 33]
[52, 57, 59, 68, 28, 72, 33, 96]
[52, 57, 59, 68, 28, 33, 72, 96]
[28, 33, 52, 57, 59, 68, 72, 96]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值