数据结构-归并排序

java实现归并排序算法

源代码

public class MergeSort extends DataCrol {
    // 合并两个已排好序的数组A[left...mid]和A[mid+1...right]
    void merge(int A[], int left, int mid, int right) {
        int len = right - left + 1;
        int[] temp = new int[len];// 辅助空间O(n)
        int index = 0;
        int i = left;                   // 前一数组的起始元素
        int j = mid + 1;                // 后一数组的起始元素
        while (i <= mid && j <= right) {
            temp[index++] = A[i] <= A[j] ? A[i++] : A[j++];  // 带等号保证归并排序的稳定性
        }
        while (i <= mid) {
            temp[index++] = A[i++];
        }
        while (j <= right) {
            temp[index++] = A[j++];
        }
        for (int k = 0; k < len; k++) {
            A[left++] = temp[k];
        }
    }

    // 递归实现的归并排序(自顶向下)
    void mergeSortRecursion(int A[], int left, int right) {
        if (left == right)    // 当待排序的序列长度为1时,递归开始回溯,进行merge操作
            return;
        int mid = (left + right) / 2;
        mergeSortRecursion(A, left, mid);
        mergeSortRecursion(A, mid + 1, right);
        merge(A, left, mid, right);
    }

    // 非递归(迭代)实现的归并排序(自底向上)
    void mergeSortIteration(int A[]) {
        int len = A.length;
        int left, mid, right;// 子数组索引,前一个为A[left...mid],后一个子数组为A[mid+1...right]
        for (int i = 1; i < len; i *= 2) {       // 子数组的大小i初始为1,每轮翻倍
            left = 0;
            while (left + i < len) {              // 后一个子数组存在(需要归并)
                mid = left + i - 1;
                right = mid + i < len ? mid + i : len - 1;// 后一个子数组大小可能不够
                merge(A, left, mid, right);
                left = right + 1;               // 前一个子数组索引向后移动
            }
        }
    }

    @Override
    public void sort(int[] array) {
//        mergeSortIteration(array);
        mergeSortRecursion(array, 0, array.length - 1);
    }

    public static void main(String[] args) {
        MergeSort mergeSort = new MergeSort();
        int[] array = DataCrol.createRandomArray(20);
        DataCrol.print(array);
        mergeSort.sort(array);
        DataCrol.print(array);
        mergeSort.timeTest(10000000);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值