归并排序

package com.hzins.suanfa;


/**
 * 归并排序
 * @author Administrator
 *
 */
public class MergeSort {
    public static void merge(int[] nums, int low, int mid, int high){
        int[] temp = new int[high - low + 1];
        int i = low;
        int j = mid + 1;
        int k =0;
        while(i <= mid && j <= high){
            if(nums[i] <= nums[j]){
                temp[k ++] = nums[i ++];
            }else{
                temp[k ++] = nums[j ++];
            }
        }
        while(i <= mid){
            temp[k ++] = nums[i ++];
        }
        while(j <= high){
            temp[k ++] = nums[j ++];
        }
        for (int k2 = 0; k2 < temp.length; k2++) {  
            nums[k2 + low] = temp[k2];  
        }  
    }
    /**
     * 首先,递归最底层的运算开始是两个单个元素当成子数组,所以递归的出口是left >=right
     * 此时递归到倒数第二层,left比right小1, 算出的mid为left,此时,出口就是mergeSort(arr, mid + 1, right)
     * 和mergeSort(arr, left, mid)
     * 
     * @param arr
     * @param left
     * @param right
     */
    public static void mergeSort(int[] arr, int left,int right){
        if(left >= right){
            return ;
        }
        int mid = (left + right) / 2;
        mergeSort(arr, mid + 1, right);
        mergeSort(arr, left, mid);
        merge(arr, left, mid, right);
    }
    public static void main(String[] args) {
        int[] a = {-1,2,-3,4,-5,6,-7,8,-9};
        mergeSort(a, 0, a.length - 1);
        for(int i = 0;i<a.length;i++){
            System.out.println(a[i] + " ");
        }
    }
}
原文地址:https://www.cnblogs.com/caobojia/p/6770508.html