合并排序Java实现

本文介绍了如何使用Java实现合并排序算法,通过一个PointPair类记录排序段,展示了递归过程。虽然原理不复杂,但对于缺乏编程经验的人来说可能会有一定难度。这个实现利用空间换取了时间效率,通过中间数组进行合并操作。
摘要由CSDN通过智能技术生成

合并排序的原理不复杂,但之前没有用代码实现过。这次用Java写了下,感觉不难也不简单。比一般的递归更复杂点,如果没有一定的编程经验会很难。我这里写了个类(PointPair)来记录排序段。这样的话,就存在内存开销了,但合并算法就是用空间换时间吧。

关键是要理解这一句:

return merge(sort(new PointPair(pair.start, split)), sort(new PointPair(split, pair.end)));
package com.example.demo;

import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {
        Arrays.stream(MergeSort.sort(new int[]{9, 9, 9, 0, 0, 0, 4, 3, 2, 2, 1, 8})).forEach(i -> {
            System.out.print(i + ",");
        });
    }

    static int[] sort(int[] input) {
        return new MergeSorter(input).getArr();
    }
}

class MergeSorter {
    private int[] arr;

    public MergeSorter(int[] arr) {
        this.arr = arr;
        sort(new PointPair(0, arr.length));
    }

    private PointPair sort(PointPair pair) {
        if (pair != null) {
            if (pair.end - pair.start > 1) {
                int split = pair.getSplit();
                merge(sort(new PointPair(pair.start, split)), sort(new PointPair(split, pair.end)));
                return pair;
            }
            return pair;
        }
        return null;
    }

    private void merge(PointPair pair, PointPair pair1) {
        int[] copy = Arrays.copyOfRange(this.arr, pair.start, pair.end);
        int start = pair.start;
        int start1 = pair1.start;
        int sorted = start;
        start = 0;
        while (start < copy.length && start1 < pair1.end) {
            if (copy[start] > arr[start1]) {
                arr[sorted] = arr[start1];
                start1++;
            } else {
                arr[sorted] = copy[start];
                start++;
            }
            sorted++;
        }
        while (start < copy.length) {
            arr[sorted++] = copy[start++];
        }
    }


    public int[] getArr() {
        return arr;
    }

    class PointPair {
        private int start;
        private int end;

        public PointPair(int start, int end) {
            this.start = start;
            this.end = end;
        }

        public int getSplit() {
            return (start + end) / 2 + (start + end) % 2;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值