经典排序算法之:归并排序

排序就是将一组对象按照某种顺重新排列的过程,但是在处理较大的数字时,普通的排序已经没法满足时间的要求,于是发现了一种简单的递归排序的算法:归并排序

1.归并排序的定义

  所谓的归并排序,就是将一个要排序的数组递归的分成两半分别排序,排好序后,然后在将两部分数组归并起来。

优点:
其性质使它能够保证任意长度为N的数组排序所需时间和NlogN成正比;
 
缺点:
它所需的格外空间和N成正比

2.归并排序算法的过程及思想

例如数组:nums={2,9,5,4}

如图将nums的四个元素进行递归拆分:

在这里插入图片描述

继续拆分:

在这里插入图片描述

拆到单个元素时候,已经无法进行拆分了,此时,就开始合并,并在合并的过程中排序:

在这里插入图片描述

继续合并:

在这里插入图片描述

此时归并排序已经结束。

整体的思想就是递归调用持续将数组划分为子数组,直到每个子数组只包含一个元素。然后,改算法将这些笑的子数组归并为稍大的有序子数组,直到形成一个有序的数组。

因此,对于多元素数组也有更好的理解:
在这里插入图片描述

3.归并排序算法的实现:

public class MergeSort { //归并排序
    public  static void mergeSort(int[] list){
        if (list.length>1){

            //归并排序前部分的数组
            int firstHalf[] = new int[list.length/2];
            System.arraycopy(list, 0,firstHalf,0,list.length/2);
            mergeSort(firstHalf);

            //归并排序后部分的数组
            int secondHalfLength = list.length - list.length/2;
            int [] secondHalf = new int[secondHalfLength];
            System.arraycopy(list,list.length/2,secondHalf,0,secondHalfLength);
            mergeSort(secondHalf);

            merge(firstHalf,secondHalf,list);
        }
    }


    public static void merge(int[] firstHalf, int[] secondHalf, int[] list) {
        int current1 =0;
        int current2 =0;
        int current3 =0;

        while (current1 <firstHalf.length && current2 < secondHalf.length){

            if (firstHalf[current1] <= secondHalf[current2]){
                list[current3++] = firstHalf[current1++];
            }else {
                list[current3++] = secondHalf[current2++];
            }
        }

        while (current1 <firstHalf.length){
            list[current3++] = firstHalf[current1++];
        }

        while (current2 < secondHalf.length){
            list[current3++] = secondHalf[current2++];
        }
    }


}

注意:

  • 在比较firstHalf[current1] < secondHalf[current2] 将< 换成<=
    号。即:firstHalf[current1] <= secondHalf[current2]

这样,在其左右相等时候会将左边的元素先加入新数组。这样做的好处是有利于解决一些算法问题:
 
例如:
  逆序对

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风儿吹吹吹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值