数据结构与算法-排序-归并排序

package sort;

import java.util.Arrays;

/**
 * @author taoke
 * @desc 归并排序
 * @email 1504806660@qq.com
 * @date 2022/1/7
 */
public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
        sort(arr, 0, arr.length - 1, new int[arr.length]);
        System.out.println(Arrays.toString(arr));
    }


    /**
     * 递归实现归并排序
     *
     * @param arr   待排序数组
     * @param left  左边索引
     * @param right 右边索引
     * @param temp  临时数组
     */
    public static void sort(int[] arr, int left, int right, int[] temp) {
        if (left < right) {
            int mid = (left + right) / 2;
            sort(arr, left, mid, temp);
            sort(arr, mid + 1, right, temp);
            mergeSort(arr, left, mid, right, temp);
        }
    }


    /**
     * 将数组从left下标到right下标之间的元素进行归并排序
     *
     * @param arr   数组
     * @param left  左边下标
     * @param mid   中间下标
     * @param right 右边下标
     * @param temp  临时数组
     */
    public static void mergeSort(int[] arr, int left, int mid, int right, int[] temp) {
        //初始化变量i,左边有序序列索引,因为i 经常会变,所以定义一个变量
        int i = left;
        //初始化变量j,右边有序序列索引
        int j = mid + 1;
        //temp数组的索引
        int t = 0;
        //(一)
        //先把左右两边(有序)的数据按照规则填充到temp数组
        //直到左右两边的有序序列,有一边处理完毕为止
        while (i <= mid && j <= right) {
            //如果左边的有序序列的元素小于右边的有序序列元素
            //则将左边的元素填充到temp数组
            if (arr[i] <= arr[j]) {
                temp[t] = arr[i];
                t++;
                i++;
            } else {//反之,将右边的有序序列元素,填充到temp数组
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        //(二)
        //把左边有剩余的一边的数据全部一次填充到temp
        while (i <= mid) {
            temp[t] = arr[i];
            t++;
            i++;
        }
        //把右边有剩余的一边的数据全部一次填充到temp
        while (j <= right) {
            temp[t] = arr[j];
            t++;
            j++;
        }
        //(三)
        //将temp数组的元素拷贝到原数组 arr
        int k = left;
        t = 0;
        while (k <= right) {
            arr[k] = temp[t];
            k++;
            t++;
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值