归并排序

package com.zhao.algorithm.sort;

import java.util.Arrays;

/**
 * AUTHOR :zhao
 * 日期:2020/2/14 19:10
 * 归并排序
 * 将一个数组中2边有序的子数组进行排序
 *  左边的数据不断递归排序语序,右边同理
 */
public class MergeSort {
    public static void main(String[] args) {
//        int array[]={60,56};
//        merge(array,0,0,array.length-1);
//        System.out.println(Arrays.toString(array));
        int[] array ={60,56,1,4,5,0,12,10,9,7,4,5,2,4,3};
        mergeSort(array,0,array.length-1);
        System.out.println(Arrays.toString(array));
    }

    /**
     *  将一个数组中指定的位置进行归并排序
     * @param arr 数组
     * @param left 开始排序的数组下标
     * @param right 右边数据的最后一个元素下标
     */
    static  void mergeSort(int[]arr ,int left,int right){
        //中间下标
        int middle=(right+left)/2;
        //结束条件 当左右2边下标重合时
        if(left<right) {
            //左边的进行排序
            mergeSort(arr, left, middle);
            //右边的进行排序
            mergeSort(arr, middle + 1, right);
            //归并
            merge(arr, left, middle, right);
        }
    }

    /**
     *  将一个数组分为2部分进行归并
     * @param arr 数组
     * @param left 开始排序的数组下标
     * @param mid  从哪里将这个数据分为2部分
     * @param right 右边数据的最后一个元素下标
     */
    static void merge(int[]arr ,int left,int mid,int right){
         //声明一个临时数据存放归并后的元素
         int[] tmp = new int[right-left+1];
         //左边数组需要遍历的下标
         int low=left;
         //右边数组需要遍历的下标
         int high=mid+1;
         //临时数组的下标
         int index=0;
         //在左右数组都有数值的情况下进行遍历
         while (low<=mid&&high<=right){
             //左边数组小存放左边数组值到临时数组中
            if(arr[low]<arr[high]){
                tmp[index++]=arr[low++];
            }else {
                //you边数组小存放左边数组值到临时数组中
                tmp[index++]=arr[high++];
            }
         }
         //遍历长一点的数组的剩余值到临时数组中
         while (low<=mid){
             tmp[index++]=arr[low++];
         }
         //右边的
         while (high<=right){
             tmp[index++]=arr[high++];
         }
         //把临时数组放回原数组中
        for (int i = 0; i <tmp.length ; i++) {
            arr[i+left]=tmp[i];
        }
     }

}

 

posted @ 2020-02-14 22:20  Angry-rookie  阅读(58)  评论(0)    收藏  举报