归并排序

简介:

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

归并排序

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

归并流程

  • 直接上图

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];
        }
    }
}
目录
相关文章
|
2月前
归并排序详解
归并排序详解
18 1
|
7月前
|
人工智能 BI
归并排序
归并排序。
20 0
|
2月前
|
存储 算法 搜索推荐
C++归并排序的实现
C++归并排序的实现
|
4月前
|
搜索推荐
归并排序是什么
归并排序是什么
|
6月前
20 归并排序
20 归并排序
19 0
|
10月前
|
存储 算法 搜索推荐
归并排序(看了就会)
归并排序(看了就会)
|
搜索推荐 算法 C#
C#——归并排序
C#——归并排序
122 0
|
算法
【2. 归并排序】
归并与快排不同: >快速排序: >- 分界点是随机数组里面的一个`数`来分,使得左边都是<= 这个数,右边 >= 这个数 (`数值`) >- 先分完,在分别递归俩边 > >归并排序: >- 先递归俩边,在进行合并操作 >- 分界点是`整个数组中间的位置`(`下标值`)
65 0
【2. 归并排序】