八大排序算法之-归并排序 java代码

来源:互联网 发布:js判断滚动条是否存在 编辑:程序博客网 时间:2024/06/09 17:07
import java.util.Arrays;/** * Created by Administrator on 2017/8/2. */public class mergeSort_ {    public static void main(String args[]) {        int[] arr = { 6, 9, 1, 3, 1, 2, 2, 5, 6, 1, 3, 5, 9, 7, 2, 5, 6, 1, 9 };        //[1, 1, 1, 1, 2, 2, 2, 3, 3, 5, 5, 5, 6, 6, 6, 7, 9, 9, 9]        mergeSort(arr,0,arr.length-1);        System.out.println(Arrays.toString(arr));    }    /*算法思想:(拆分+合并)(采用递归方法:将一个序列从中间划分成两部分,然后在每一部分再划分,直至各个部分都    只包含一个元素,接下来归并)    * 1.拆分成只包含一个元素的多个子序列    * 2.对子序列进行归并*/    /*时间复杂度:O(nlogn)    * 空间复杂度:O(n)    * 稳定性:稳定*/    private static void mergeSort(int[] arr, int start, int end) {        int mid = (start + end)/2;        if (start<end) {            //左边            mergeSort(arr,start,mid);//左边包含mid值            //右边            mergeSort(arr,mid+1,end);            //左右归并            merge(arr,start,mid,end);        }    }    private static void merge(int[] arr, int start, int mid, int end) {        int [] tmp = new int[end-start+1];        int l = start;        int r = mid + 1;        int indextmp = 0;        while (l<=mid && r <= end) {            if (arr[l]<=arr[r]) {//<=保证序列具有稳定性                tmp[indextmp++] = arr[l++];            }else {                tmp[indextmp++] = arr[r++];            }        }        while (l<=mid){//把左边剩余的部分移入数组            tmp[indextmp++] = arr[l++];        }        while (r<=end) {//把右边剩余部分移入数组            tmp[indextmp++] = arr[r++];        }        for (int i = 0; i<tmp.length; i++) {            arr[start+i] = tmp[i];        }    }}