归并排序

作者: 趁年轻多奋斗 | 来源:发表于2019-04-19 12:58 被阅读2次

    百度:

        归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

    我的理解:

        首先将一组无序的数组按照长度进行等分拆分,直到分成只有一个数字,然后再进行相邻之间的比较,从而再合并起来。是一种先分后和的做法,高逼格说法为分治法(分治法通常要运用递归方法)。

    脑补例子:

        原数组     [5,1,6,7,1,6,8,2,10]

        使用递归进行拆分后结果    5 1 6 7 1 6 8 2 10    

        第一次归并后    {1,5}(+1){6,7} {1,6}(+1){2,8}(+1){10}    共比较3次

        第二次归并后    {1,5,6,7} (+2) {1,2,6,8} (+3)  {10}    共比较5次

        第三次归并    {1,1,2,5,6,6,7,8} (+6)    {10}    共比较6次

        第四次归并     {1,1,2,5,6,6,7,8,10}  {+8}     共比较8次    

        自己写的数组,死都要排完......

    实现代码(java):

    package com.company;

    import java.util.Arrays;public class Main {

        public static void main(String[] args) {

            int[] arr = new int[]{1, 4, 6, 83, 5, 7, 2, 10};

    //      Main.merge(arr,0,(arr.length-1)/2,arr.length-1);

            Main.mergeSort(arr, 0, arr.length - 1);        

            System.out.println(Arrays.toString(arr));

    }    

    //归并排序    

    private static void mergeSort(int[] arr, int low, int hight) {

            int middle = (hight + low) / 2;

            //结束条件

            if (low < hight) {

                //处理左边

                mergeSort(arr, low, middle);

                //处理右边 

               mergeSort(arr, middle + 1, hight);

                //归并

                merge(arr, low, middle, hight);

            }

        }

        public static void merge(int[] arr, int low, int midden, int hight) {

            //用来存储归并后的临时数组

            int[] temp = new int[hight - low + 1];

            //记录第一个数组中需要遍历的下标

            int i = low;

            //记录第二个数组中需要遍历的下标

            int j = midden + 1; 

           //用于记录临时数组中存放的下标

            int index = 0;

            //遍历两组数组取出最小数字,放入临时数组

            while (i <= midden && j <= hight) {

                //第一组数组的数字比第二组数组小

                if (arr[i] <= arr[j]) {

                    temp[index] = arr[i];

                    i++;

                }

                //反之

                else {

                    temp[index] = arr[j];

                    j++; 

               }

                index++;

            }

            //当第一组数组有剩下数时,再把剩下的全部添加进临时数组

            while (i <= midden) {

                temp[index] = arr[i];

                i++;

                index++;

            }

            //当第二组数组有剩下数时,再把剩下的全部添加进临时数组

            while (j <= hight) { 

               temp[index] = arr[j];

                j++;

                index++;

            }

            //把临时数组重新放到原数组中

            for (int k = 0; k < temp.length; k++) {

                arr[k + low] = temp[k];

            }

        }

    相关文章

      网友评论

        本文标题:归并排序

        本文链接:https://www.haomeiwen.com/subject/fccqgqtx.html