zoukankan      html  css  js  c++  java
  • 【java数据结构】归并排序

    package mergeSort;
    
    import java.util.Arrays;
    
    public class MergeSort {
        /**
         * 合并两段有序数组
         * 
         * @param arr
         *            原数组
         * @param start
         *            第一段有序数组的起始下标
         * @param mid
         *            第一段有序数组的结束下标
         * @param end
         *            第二段有序数组的结束下标
         */
        private static void mergeArray(int[] arr, int start, int mid, int end) {
            int i = start, j = mid + 1, k = 0;// i为第一段数组的起始下标,j为第二段数组的起始下标,k为临时数组的下标
            int[] arr2 = new int[end - start + 1];// 临时数组
            while (i <= mid && j <= end) {// 比较两段数组的对应下表处的值,小的放前面(因为都是下标,所以都取等号)
                if (arr[i] <= arr[j]) {
                    arr2[k++] = arr[i];
                    i++;
                } else {
                    arr2[k++] = arr[j];
                    j++;
                }
            }
            while (i <= mid) {// 将第一段数组剩下的复制到临时数组
                arr2[k++] = arr[i++];
            }
            while (j <= end) {// 将第二段剩下的复制到临时数组
                arr2[k++] = arr[j++];
            }
            for (i = start, k = 0; i <= end; i++, k++) {// 复制到原数组
                arr[i] = arr2[k];
            }
        }
    
        /**
         * 全部合并
         * 
         * @param arr
         *            原数组
         * @param gap
         *            每次合并的长度
         * @param length
         *            数组长度
         */
        private static void merge(int[] arr, int gap, int length) {
            int i = 0;
            for (i = 0; i + 2 * gap - 1 < length; i = i + 2 * gap) {// 增量为gap*2
                mergeArray(arr, i, i + gap - 1, i + 2 * gap - 1);
            }
            if (i + gap - 1 < length) {// 对于元素个数为奇数的情况,还剩两个数组,进行归并
                mergeArray(arr, i, i + gap - 1, length - 1);
            }
        }
    
        /**
         * 排序
         * 
         * @param arr
         *            原数组
         */
        public static void mergeSort(int[] arr) {
            for (int gap = 1; gap < arr.length; gap = gap * 2) {
                merge(arr, gap, arr.length);
                /*System.out.print("gap=" + gap + ": ");
                System.out.println(Arrays.toString(arr));*/
            }
        }
    }
    
  • 相关阅读:
    C语言文法分析
    词法分析--编程感想
    词法分析(改)
    0916词法分析
    0909关于编译
    python正则表达式
    python除法运算
    python值相等和对象相同
    Java编写程序时要考虑到所有可能的异常
    hadoop 读取文件操作
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286791.html
Copyright © 2011-2022 走看看