归并排序(Merge Sort) 复习--附图示说明

版权声明:文章是精心整理准备分享给大家的,转载附上来源就好了~ https://blog.csdn.net/shanwu1985/article/details/53149921

Merge sort 和 Quick Sort 一样,是根据 divide-and-conquer 算法设计模式来实现的排序法。排序的过程有三个阶段:

1。分割:若输入的集合过小,则直接返回结果;否则将输入的集合分成二份或二份以上。

2。递归:递归地解决子问题。

3。合并:将子问题解决、合并。


分割(Divide)



合并(Conquer)-1


合并(Conquer)-2



合并(Conquer)-3


合并(Conquer)-4



合并(Conquer)-5

合并(Conquer)-6


合并(Conquer)-7 Done




Merge Sort 代码如下:

    public static <E> void sort(SinglyLinkedList<E> origin, Comparator<E> comp) {
        if (origin == null || origin.size < 2) {
            return;
        }

        // divide
        SinglyLinkedList<E> list1 = new SinglyLinkedList<E>();
        SinglyLinkedList<E> list2 = new SinglyLinkedList<E>();

        final int size = origin.size;
        int i = 0;
        while (i++ < size / 2) {
            list1.addNodeToLast(origin.removeFirst().value);
        }

        while (!origin.isEmpty()) {
            list2.addNodeToLast(origin.removeFirst().value);
        }
        System.out.print("Divided1 :");
        list1.printNodes();
        System.out.print("Divided2 : ");
        list2.printNodes();

        // recursive
        sort(list1, comp);
        sort(list2, comp);

        // conquer
        merge(origin, list1, list2, comp);
    }

合并二个内容已排序的 List

    // merge sorted lists
    public static <E> void merge(SinglyLinkedList<E> origin, SinglyLinkedList<E> list1,
                                 SinglyLinkedList<E> list2, Comparator<E> comp) {
        while (!list1.isEmpty() && !list2.isEmpty()) {
            if (comp.compare(list1.peek().value, list2.peek().value) <= 0) {
                origin.addNodeToLast(list1.removeFirst().value);
            } else {
                origin.addNodeToLast(list2.removeFirst().value);
            }
        }

        while (!list1.isEmpty()) {
            origin.addNodeToLast(list1.removeFirst().value);
        }

        while (!list2.isEmpty()) {
            origin.addNodeToLast(list2.removeFirst().value);
        }

        System.out.print("Conquer: ");
        origin.printNodes();
    }

Github链结





展开阅读全文

没有更多推荐了,返回首页