归并排序的JAVA实现和性能分析

来源:互联网 发布:js怎么给div加id 编辑:程序博客网 时间:2024/06/05 23:03

package Sort;//稳定public class mergesort {    public static void main(String[] args) {        int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};        System.out.println("排序之前:");        for (int i = 0; i < a.length; i++) {            System.out.print(a[i]+" ");        }                //归并排序        mergeSort(a);                System.out.println();        System.out.println("排序之后:");        for (int i = 0; i < a.length; i++) {            System.out.print(a[i]+" ");        }    }  //归并排序前的一些准备    public static void mergeSort(int[] arr){        int[] tmp =new int[arr.length]; //tmp为辅助数组        internalMergeSort(arr, tmp, 0, arr.length-1);    }        private static void internalMergeSort(int[] a, int[] tmp, int left, int right){        //当left==right的时,已经不需要再划分了        if (left<right){            int middle = (left+right)/2;            internalMergeSort(a, tmp, left, middle);          //左子数组            internalMergeSort(a, tmp, middle+1, right);       //右子数组            mergeSortedArray(a, tmp, left, middle, right);    //具体合并两个子数组,最近的递归返回点开始执行        }    }        // 合并两个有序子序列 arr[left, ..., middle] 和 arr[middle+1, ..., right]。tmp是辅助数组。    private static void mergeSortedArray(int arr[], int tmp[], int left, int middle, int right){        int i=left;             int j=middle+1;        int k=0;  //k计数合并后数组大小        //原数据数组只有一个arr;left right middle 来分割,确定左右子数组        //下面操作即合并俩各自有序数组        while ( i<=middle && j<=right){            if (arr[i] <=arr[j]){                tmp[k++] = arr[i++];            }            else{                tmp[k++] = arr[j++];            }        }        while (i <=middle){//剩余部分存入tmp            tmp[k++] = arr[i++];        }        while ( j<=right){//剩余部分存入tmp            tmp[k++] = arr[j++];        }        //把数据复制回原数组        for (i=0; i<k; ++i){            arr[left+i] = tmp[i];        }    }}



0 0
原创粉丝点击