美文网首页
排序算法之7:归并排序 MergeSort

排序算法之7:归并排序 MergeSort

作者: 王然Gondole | 来源:发表于2017-05-25 16:35 被阅读0次
Merge-sort-example.gif
public class MergeSort {
    public static void mergeSort(int[] arr) {
        mSort(arr, 0, arr.length - 1);
    }

    /**
     * 递归分治
     *
     * @param arr   待排数组
     * @param left  左指针
     * @param right 右指针
     */
    public static void mSort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        
        int mid = (left + right) / 2;

        mSort(arr, left, mid); //递归排序左边
        mSort(arr, mid + 1, right); //递归排序右边
        
        merge(arr, left, mid, right); //合并
    }

    /**
     * 合并两个有序数组
     *
     * @param arr   待合并数组
     * @param left  左指针
     * @param mid   中间指针
     * @param right 右指针
     */
    public static void merge(int[] arr, int left, int mid, int right) {
        //[left, mid] [mid+1, right]
        int[] tempArray = new int[right - left + 1]; //中间数组

        
        int leftIndexFromLeft = left;   //左边序列左指针
        int leftIndexFromRight = mid + 1;   //右边序列左指针
        
        int tempArrIndex = 0;
        //左序列左指针在左序列范围之内,右序列左指针在右序列范围之内
        while (leftIndexFromLeft <= mid && leftIndexFromRight <= right) {   

            //比较左序列左指针对应数字和右序列左指针对应数字,选择较小的数字移动到临时数组内
//          if (arr[leftIndexFromLeft] <= arr[leftIndexFromRight]) {    
//              tempArray[tempArrIndex++] = arr[leftIndexFromLeft++];
//          } else {
//              tempArray[tempArrIndex++] = arr[leftIndexFromRight++];
//          }

            tempArray[tempArrIndex++] = arr[leftIndexFromLeft] <= arr[leftIndexFromRight] ? 
                    arr[leftIndexFromLeft++] : arr[leftIndexFromRight++];
        }

        while (leftIndexFromLeft <= mid) {
            //合并左序列左指针右侧剩余的数字到临时数组
            tempArray[tempArrIndex++] = arr[leftIndexFromLeft++];   
        }

        while (leftIndexFromRight <= right) {
            //合并右序列右指针右侧剩余的数字到临时数组
            tempArray[tempArrIndex++] = arr[leftIndexFromRight++];  
        }

        for (int p = 0; p < tempArray.length; p++) {
            arr[left + p] = tempArray[p];   //复制临时数组内的元素到原数组内
        }
    }
}

相关文章

  • 算法分析与设计复习

    1、排序算法 QuickSort 快速排序 MergeSort 归并排序 HeapSort 堆排序 BubbleS...

  • 第三章:高级排序算法

    归并排序算法(mergeSort) 算法思想:Python使用函数实现: 自底向上的归并排序算法 算法思想:Pyt...

  • 归并排序

    归并排序 归并排序(Mergesort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分...

  • 排序算法(2):归并排序

     归并排序:归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,...

  • python归并排序--递归实现

    归并排序: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,...

  • 归并排序

    什么是归并排序? 归并排序(Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,...

  • python实现归并排序(MergeSort)

    python实现【归并排序】(MergeSort) 算法原理及介绍 归并排序的核心原理是采用分治法(Divide ...

  • 说说算法那些事-归并排序

    归并排序(mergeSort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and C...

  • 排序算法之7:归并排序 MergeSort

  • 归并排序

    一、定义 归并排序,英文称Merge sort 或 mergesort, 是创建在归并操作上的一种排序算法。是19...

网友评论

      本文标题:排序算法之7:归并排序 MergeSort

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