递归排序(合并排序)

1. 递归排序(合并)

合并排序是分而治之的排序算法。它是一种高效,基于比较的排序算法。
它的工作原理如下:

  • 将列表划分为每次迭代中大约一半大小的子列表,直到每个子列表只有一个元素。
  • 重复合并每个子列表以创建排序列表。它将一直运行,直到我们只有一个排序列表。这将是排序列表。
    如下图
    在这里插入图片描述

2. 代码实现

import java.util.Arrays;

public class MergeSortMain {

    static int arr[] = {100, 20, 15, 30, 5, 75, 40};

    public static void main(String args[]) {
        System.out.println("数据排序之前 : ");
        // 排序前打印数组
        printArray(arr, 0, arr.length - 1);
        System.out.println("-----------------------------");

        // 用递归实现排序
        mergeSort(0, arr.length - 1);

        System.out.println("-----------------------------");

        // 排序后打印数组
        System.out.println("排序后打印数组:");
        printArray(arr, 0, arr.length - 1);


    }

    /**
     * 用于合并排序的递归算法
     *
     * @param start
     * @param end
     */
    public static void mergeSort(int start, int end) {
        int mid = (start + end) / 2;
        if (start < end) {
            // 排序左半部分
            mergeSort(start, mid);
            // 排序右半部分
            mergeSort(mid + 1, end);
            // 合并左右两半
            merge(start, mid, end);
        }

    }


    /**
     *
     * @param start
     * @param mid
     * @param end
     */
    private static void merge(int start, int mid, int end) {
        // 初始化临时数组和索引
        int[] tempArray = new int[arr.length];
        int tempArrayIndex = start;

        System.out.print("合并前:  ");
        printArray(arr, start, end);

        int startIndex = start;
        int midIndex = mid + 1;

        // 它将迭代直到较小的列表到达结尾
        while (startIndex <= mid && midIndex <= end) {
            if (arr[startIndex] < arr[midIndex]) {
                tempArray[tempArrayIndex++] = arr[startIndex++];
            } else {
                tempArray[tempArrayIndex++] = arr[midIndex++];
            }
        }

        // 复制剩余的元素
        while (startIndex <= mid) {
            tempArray[tempArrayIndex++] = arr[startIndex++];
        }
        while (midIndex <= end) {
            tempArray[tempArrayIndex++] = arr[midIndex++];
        }

        // 排序后将tempArray复制到实际数组
        for (int i = start; i <= end; i++) {
            arr[i] = tempArray[i];
        }

        System.out.print("合并后:   ");
        printArray(tempArray, start, end);
        System.out.println();
    }

    /**
     * 打印数组
     *
     * @param arr   传入的数组
     * @param start 遍历开始的位置
     * @param end   遍历结束的位置
     */
    public static void printArray(int arr[], int start, int end) {
        // Arrays.stream(arr).forEach(System.out::println);
        for (int i = start; i <= end; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}


  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值