美文网首页
归并排序

归并排序

作者: wayneinyz | 来源:发表于2017-11-02 12:13 被阅读4次
    public class MergeSort {
    
        /*
        归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,
        即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
         */
    
        // 归并所需的辅助数组
        private static int[] aux;
    
        /**
         * 自顶向下的归并排序
         * @param a 待排序的数组
         * @param low 低位索引
         * @param high 高位索引
         */
        public static void mergeSort(int[] a, int low, int high) {
            // 一次性分配空间
            aux = new int[a.length];
    
            // 将数组a[low..high]排序
            if (low >= high)
                return;
    
            int mid = low + (high - low)/2;
    
            mergeSort(a, low, mid); // 将左半边排序
            mergeSort(a, mid+1, high); // 将右半边排序
            merge(a, low, mid, high); // 归并结果
        }
    
        // 原地归并
        public static void merge(int[] a, int low, int mid, int high) {
            // 将a[low..mid] 和 a[mid+1..high] 归并
            int i = low;
            int j = mid+1;
    
            // 将a[low..high]复制到aux[low..high]
            for (int k = low; k <= high; k++) {
                aux[k] = a[k];
            }
    
            // 归并回到a[low..high]
            for (int k = low; k <= high; k++) {
                if (i > mid)
                    a[k] = aux[j++];
                else if (j > high)
                    a[k] = aux[i++];
                else if (aux[i] > aux[j])
                    a[k] = aux[j++];
                else
                    a[k] = aux[i++];
            }
        }
    
        public static void main(String[] args) {
            int[] a = new int[] {2, 4, 7, 5, 11, 3, 1, 9, 7, 8, 10, 6, 2, -1, 0, -2};
            mergeSort(a, 0, a.length-1);
            for (int i = 0; i < a.length; i++) {
                System.out.print(a[i] + " ");
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:归并排序

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