java 自底向上的归并排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 自底向上的归并排序相关的知识,希望对你有一定的参考价值。

public class MergeBU {
    private static Comparable[] temp;

    public static void sort(Comparable[] a) {
        int N = a.length;
        temp = new Comparable[N];
        for (int size = 1; size < N; size *= 2) {    // size: 子数组大小,每次翻倍
            for (int low = 0; low < N - size; low += size * 2) {     // low: 子数组第一个元素的索引
                merge(a, low, low + size - 1, Math.min(low + size * 2 - 1, N - 1));
            }
        }
    }

    public static void merge(Comparable[] a, int low, int mid, int high) {
        // 将a[low...mid]和a[mid+1...high]归并
        // 将数组a复制到数组temp
        for (int k = low; k <= high; k++) {
            temp[k] = a[k];
        }
        int i = low;
        int j = mid + 1;
        for (int k = low; k <= high; k++) {
            if (i > mid) {  // 左半边用尽
                a[k] = temp[j++];   // 取右半边元素
            } else if (j > high) {  // 右半边用尽
                a[k] = temp[i++];   // 取左半边元素
            } else if (less(temp[j], temp[i])) {
                a[k] = temp[j++];
            } else {
                a[k] = temp[i++];
            }
        }
    }

    private static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }

    private static void show(Comparable[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Integer[] a = {1, 3, 7, 7, 0, 5, 7, 1, 0, 5, 9};
        sort(a);
        show(a);
    }
}

以上是关于java 自底向上的归并排序的主要内容,如果未能解决你的问题,请参考以下文章

自底向上的归并排序算法

自底向上归并排序(Merge Sort)

算法——归并排序(自顶向下自底向上)

排序算法-归并排序

挖掘算法中的数据结构:O(n*logn)排序算法之 归并排序(自顶向下自底向上) 及 算法优化

精益求精单链表归并排序与快速排序