【图解算法】排序算法——归并排序

0.什么是归并排序(Merge sort)?

是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。(from zh.wikipedia.org

我对归并排序的理解是——分而治之,就是一个问题看起来很复杂,那就将他分开处理,这也是递归的思想; 就拿排序这件事件来说,对一个数组的排序,我们可以将他分成两个数组来处理,再对这两个数组同样的道理来处理,将他们分别分成两个数组来处理…… 直到数组无法再细分下去(即数组的长度为1,只有一个元素的数组肯定是有序的),分为之后的数组进行合并操作,向上整合整个数组,最后到达得到一个有序的数组的目的。

可能这样说得很抽象,我们一起来看归并排序的动态处理元素的图例:
这里写图片描述

看着图的同时再来看一看具体的代码实现过程:

    public static void main(String [] args){
        int[] t = {18,7,8,6,33,2,9,1};
        mergSort(t,0,7);
        for (int i = 0;i<t.length;i++)
            System.out.print(t[i] + "\t");
    }


    public static void mergSort(int [] arr,int l,int r){
        if(l>=r) return;
        int mid = (l+r)/2;
        //递归二分 将数组分为  [左,中],(中,右]
        mergSort(arr,l,mid);
        mergSort(arr,mid+1,r);
        //归并排序
        int aux[] = new int[r-l+1]; //这里弄一个要处理的数组副本 长度是 R-L+1 
        for (int i =l;i<=r ;i++)    //副本数组从 L 开始,所以与原数组存在一个 L 的偏移量
            aux[i-l] = arr[i];
        int i = l,j = mid+1;        //i记录左边元素的下标位置 j记录右边元素的下标位置
        for (int k =l;k <= r; k++){ //k记录 arr 的下标位置
            if(i >mid){
                arr[k] = aux[j-l];
                j++;
            }else if(j >r){
                arr[k] = aux[i-l];
                i++;
            }else if(aux[i-l] < aux[j-l]){
                arr[k] = aux[i-l];
                i++;
            }else{
                arr[k] = aux[j-l];
                j++;
            }
        }
    }

程序输出:

1 2 6 7 8 9 18 33

图解算法目录

【图解算法】排序算法——冒泡排序、选择排序

【图解算法】排序算法——插入排序

【图解算法】排序算法——归并排序

【图解算法】排序算法——快速排序

【图解算法】Java GC算法

【图解算法】排序算法——堆排序

【图解算法】并查集 —— 联合查找算法

【图解算法】排序算法——计数排序

Gif Power By https://visualgo.net

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值