排序算法之归并排序(Java)

Posted yuwenS.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法之归并排序(Java)相关的知识,希望对你有一定的参考价值。

通过Java实现归并排序

归并排序介绍

归并排序是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法的一个非常典型的应用。

归并算法的主要步骤

  1. 将待排序的序列分成两个子序列
  2. 将子序列合并并排序
  3. 重复一二步骤

归并排序图解实现

归并算法图解

具体代码实现

合并子序列的方法

    /**
     *
     * @param arr 排序的原始数组
     * @param left  左边有序序列的初始索引
     * @param mid  中间索引
     * @param right  右边索引
     * @param temp  做中转的数组
     */
    public static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;//左边有序序列的初始化索引
        int j = mid + 1;//右边有序序列的初始化索引
        int t = 0;//指向temp数组的当前索引
        //按规则将左右两边有序数据填充到temp数组中
        while(i <= mid && j <= right){
            //如果左边的有序数列元素小于右边将左边的元素填入temp数组
            if (arr[i] <= arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            }else {
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        //把左边剩余的一边依次填入temp数组
        while (i <= mid){
            temp[t] = arr[i];
            t++;
            i++;
        }
        //把右边剩余的一边依次填入temp数组
        while (j <= right){
            temp[t] = arr[j];
            t++;
            j++;
        }
        t = 0;
        int tempLeft = left;
        while (tempLeft <= right){
            arr[tempLeft] = temp[t];
            t++;
            tempLeft++;
        }
    }

分+合并子序列的方法

	public static void mergeSoft(int[] arr,int left,int right,int[] temp){
        if (left < right){
            int mid = (left + right) / 2; //中间索引
            //向左递归分解
            mergeSoft(arr,left,mid,temp);
            //向右递归分解
            mergeSoft(arr,mid+1,right,temp);
            //每分解一次就合并一次
            merge(arr,left,mid,right,temp);
        }
    }

测试

测试代码

	public static void main(String[] args) {
         int[] arr = {8,6,2,4,1,5,7,3};
        System.out.println("=================排序前================");
        System.out.println(Arrays.toString(arr));
        int[] temp = new int[arr.length];
        mergeSoft(arr,0,arr.length-1,temp);
        System.out.println("=================排序后================");
        System.out.println(Arrays.toString(arr));
    }

测试结果

测试结果

以上是关于排序算法之归并排序(Java)的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之归并排序

重温基础算法内部排序之归并排序法

重温基础算法内部排序之归并排序法

用Java写算法之归并排序

排序算法入门之归并排序(java实现)

排序之归并排序的算法思想及实现代码