归并排序

前言

归并排序–{7,2,9,4,3,8,6,1}。分治法实现:

分治法(分治合)

sort(A,p,r)  //A为排列数组
if p<r then q<(p + r)/2
sort(A,p,q)
sort(A,q + 1,r)
merge(A,p,q,r)

在这里插入图片描述

Java语言编写


import java.util.Arrays;
public class MergeSort {
    public static void main(String[] args) {

        int[] data = {7,2,9,4,3,8,6,1};

        System.out.println("排序之前:" + Arrays.toString(data));
        //Arrays.toString(data)方法输出这个串数

        mergeSort(data);

        System.out.println("排序之后:" + Arrays.toString(data));
    }
    private static void mergeSort(int[] data) {

        //归并排序.声明
        sort(data, 0, data.length - 1);
    }

    //将索引从left到right范围的数组元素进行归并排序
    private static void sort(int[] data, int left, int right) {

        if (left < right) {//找到只剩一个数,才停止递归

            //找出中间索引
            int center = (left + right) / 2;
            //分
            sort(data, left, center);
            sort(data, center + 1, right);
            //合并
            merge(data, left, center, right);
        }                //实现递归的调用
    }

    // 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序
    private static void merge(int[] data, int left, int center, int right) 
    {

        int[] tempArr = new int[data.length];  
        //定义一个tempArr数组长度为输入的数字个数
        int mid = center + 1;
        int third = left;
        int temp = left;

        while (left <= center && mid <= right) {
            if (data[left] - data[mid] <= 0) {
                tempArr[third++] = data[left++];
            }else {
                tempArr[third++] = data[mid++];
            }
        }
        while (mid <= right) {
            tempArr[third++] = data[mid++];
        }
        while (left <= center) {
            tempArr[third++] = data[left++];
        }
        while (temp <= right) {
            data[temp] = tempArr[temp++];
        }
    }
}

运行结果

在这里插入图片描述

原理图

在这里插入图片描述归并排序是将一组无序数列分组比较再排序的方法
在这里插入图片描述

然后将两组排好序的数列合并排序。
在这里插入图片描述

合并结果
在这里插入图片描述

补充

  • 在编写含有递归的算法时,我们不需要具体的去考虑递归内部的情况是什么样的。
    算法复杂度
时间复杂度空间复杂度
n*log(n)n*log(n)

虽然在排序的速度上,归并排序并没有快排速度快,但是归并排序是稳定的。一组数里面有相同的数,也不容易出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值