归并排序

作者: hipeer | 来源:发表于2018-09-01 17:09 被阅读0次

    归并排序Java实现

    
    public class MergerSort {
    
        public static void mergerSort(int[] array) {
            int[] temp = new int[array.length];
            recSort(temp, array, 0, array.length-1);
            display(array);
        }
        // 分割数组
        private static void recSort(int[] temp, int[] array, int lower, int upper) {
            if(lower == upper) return;
            int middle = (upper + lower)/2;             // 从数组的中间位置分割
            recSort(temp, array, lower, middle);        // 递归分割左子数组
            recSort(temp, array, middle + 1, upper);    // 递归分割右子数组
            merger(temp, array, lower, middle, upper);  // 合左右子数组
        }
        // 合并两个有序数组
        private static void merger(int[] temp, int[] array, int lower, int middle, int upper) {
            int tempIndex = 0;                          // 中间数组的开始下标
            int leftIndex = lower;                      // 左边数组的开始下标
            int centerIndex = middle;                   // 左边数组的结束下标
            int rightIndex = middle + 1;                // 右边数组的开始下标
            int currTempLength = upper - lower + 1;     // 两个有序数组合并成的一个有序数组后的长度, 用于copy中间数组到原数组
            // 合并两个有序数组到中间数组
            while(leftIndex <= centerIndex && rightIndex <= upper) {
                if(array[leftIndex] < array[rightIndex]) {
                    temp[tempIndex++] = array[leftIndex++];
                } else {
                    temp[tempIndex++] = array[rightIndex++];
                }
            }
            // 如果右子数组没有元素了, 就把左子数组剩下的元素copy到中间数组
            while(leftIndex <= centerIndex) {
                temp[tempIndex++] = array[leftIndex++];
            }
            // 如果左子数组没有元素了, 就把右子数组剩下的元素copy到中间数组
            while( rightIndex <= upper) {
                temp[tempIndex++] = array[rightIndex++];
            }
            
            // 把排好的中间数组copy到原数组
            for(int i = 0; i < currTempLength; i++) {
                array[lower++] = temp[i];
            }
        }
    
        
        public static void display(int[] arr) {
            for(int x: arr) {
                System.out.print(x+" ");
            }
            
        }
        public static void main(String[] args) {
            int[] array = { 6, 3, 7, 2, 5, 1, 3, 9 };
            System.out.println("排序开始");
            long s = System.currentTimeMillis();
            mergerSort(array);
            long e = System.currentTimeMillis();
            System.out.println("\n排序结束用时"+(e-s)+"ms");
        }
    }
    

    相关文章

      网友评论

        本文标题:归并排序

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