归并排序

  1. 云栖社区>
  2. 博客>
  3. 正文

归并排序

期待l 2018-12-23 11:48:35 浏览810
展开阅读全文

这是一篇自学文章,如果有错误地方请及时指出

归并排序

  • 就是将多个有序数组合并成一个有序数组,那么多个有序数组是由一个无序数组拆分比较在排序产生的,如果参与合并的只有两个有序表,那么就称为二路合并.本文是以二路合并开始学习的,当然也有多路合并

归并流程

  • 直接上图

markdown_img_paste_20181223111224645

  • 当然下面两个还没有合并成整个的有序数组,因为画不下了...

比较原理

markdown_img_paste_20181223111315674

代码实现

markdown_img_paste_20181223111333115

import java.util.Arrays;

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

    private static void mergeSort(int[] arr, int start, int end) {
        //代表已经拆分到不可再拆了
        if (start>=end){
            return;
        }
        int middle = (start + end) / 2;
        mergeSort(arr,start,middle);
        mergeSort(arr,middle+1,end);
        merge(arr,start,middle,end);
    }

    private static void merge(int[] arr, int start, int middle, int end) {
        //临时数组的下标索引
        int index = 0;
        int[] tempArr = new int[end - start + 1];
        int s = start;
        int se = middle;
        int m = middle +1;
        int me = end;
        //s<=se即第一个待排序数组,m<=me即第二个待排序数组,可以看代码变量说明图
        while (s<=se && m<=me){
            //即第一个待排序数组和第二个待排序数组开始比较
            if (arr[s] < arr[m]){
                //如果s比较小,那么就赋值给临时数组,然后将s边的数组索引往后移一位
                tempArr[index++] = arr[s++];
            }else {
                //到这就算m边比较小了,那么就赋值给临时数组,然后将m边的数组索引往后移一位
                tempArr[index++] = arr[m++];
            }
        }
        //下面这两个循环,代表如果切分的不是五五开,比如一边有4个元素一边有3个元素,然而上面的循环只能是比较
        //两边元素的前三个,而会有一个剩余的没有添加进来,所以下面循环是来判断不是五五开的情况的
        while (s<=se){
            tempArr[index++] = arr[s++];
        }
        while (m<=me){
            tempArr[index++] = arr[m++];
        }
        //到这了,那么这次的两个待排序数组就已经排序完毕,已经放入tempArr里面了.
        //我们的方法的参数start代表了这次数组比较的开始,所以我们还必须将整个tempArr里面的元素
        //倒入进arr里,开始就是start位置
        for (int i = 0; i < index; i++) {
            arr[start+i] = tempArr[i];
        }
    }
}

网友评论

登录后评论
0/500
评论
期待l
+ 关注