归并排序,自顶向下与自底向上两种方式(Java实现)

封装成类:

package com.roc.algorithms.sort;

/**
 * 归并排序
 *
 * @author imroc
 */
public class MergeSort {
    //自顶向下方式
    public static void sortUpToDown(int[] a) {
        int[] aux = new int[a.length];
        sort(a, aux, 0, a.length - 1);
    }

    //自底向上方式
    public static void sortDownToUp(int[] a) {
        int[] aux = new int[a.length];
        for (int sz = 1; sz < a.length; sz *= 2) {
            for (int lo = 0; lo < a.length - sz; lo += 2 * sz) {
                merge(a, aux, lo, lo + sz - 1, Math.min(lo + 2 * sz - 1, a.length - 1));
            }
        }
    }

    private static void merge(int[] a, int[] aux, int lo, int mid, int hi) {
        for (int k = lo; k <= hi; k++) {
            aux[k] = a[k];
        }
        int i = lo, j = mid + 1;
        for (int k = lo; k <= hi; k++) {
            if (i > mid) {
                a[k] = aux[j++];
            } else if (j > hi) {
                a[k] = aux[i++];
            } else if (aux[j] < aux[i]) {
                a[k] = aux[j++];
            } else {
                a[k] = aux[i++];
            }
        }
    }

    private static void sort(int[] a, int[] aux, int lo, int hi) {
        if (lo >= hi) {
            return;
        }
        int mid = (lo + hi) >> 1;
        sort(a, aux, lo, mid);
        sort(a, aux, mid + 1, hi);
        merge(a, aux, lo, mid, hi);
    }
}

测试:

int[] a = {9, 0, 6, 5, 8, 2, 1, 7, 4, 3};
System.out.println(Arrays.toString(a));
MergeSort.sortUpToDown(a);
//MergeSort.sortDownToUp(a);
System.out.println(Arrays.toString(a));

输出:
[9, 0, 6, 5, 8, 2, 1, 7, 4, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 19,117评论 1 19
  • 今天想给大家推荐一个软件,讯飞语记。这个软件好神奇!绝无广告嫌疑啊,只是觉得好用,想要跟大家分享。 之前下载过这个...
    王二公子阅读 771评论 21 14
  • 大家好、我是胡图图! 最近总是生病、生病生到怂的那种。快下班的时候、隐隐感觉又要烧了、家里没人、自己去了...
    胡图图呀阅读 236评论 1 2
  • 都说吃在广州,这话说的一点没错。 广州的美食可多了,除了地道的传统小吃,本地粤菜、外省的许多菜系在这都能吃到。 广...
    耿耿广州阅读 269评论 0 0
  • 很多时候,我们对生活的难题无能为力,但却可以改变自己的态度。 你能走多远,取决于填坑的能力有多大。如果一个人无论遭...
    大医美合伙人阅读 395评论 0 2