排序算法(六)归并排序

归并排序指的是将两个已经排序的序列合并成一个序列的操作。归并排序具体工作的原理如下(假设序列共有n个元素):
1)将序列每相邻的两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素。
2)将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素。
3)重复步骤2,直到所有的元素排序完毕。

Java实现归并排序算法:

package com.review.sort;

public class MergeSort {

    // 二路归并
    public static void merge(int array[], int start1, int end1, int start2, int end2) {
        int i, j;
        i = start1;
        j = start2;

        int k = 0;
        int[] temp = new int[end2 - start1 + 1];

        while (i <= end1 && j <= end2) {
            if (array[i] > array[j])
                temp[k++] = array[j++];
            else
                temp[k++] = array[i++];
        }

        // 把剩下的元素依次放入临时数组中(肯定只剩下一方)
        while (i <= end1)
            temp[k++] = array[i++];
        while (j <= end2)
            temp[k++] = array[j++];

        k = start1;
        for (int m = 0; m < temp.length; m++) {
            array[k++] = temp[m];
        }
    }

    public static void mergeSort(int array[], int start, int end) {
        if (start < end) {
            int mid = (start + end) / 2;
            // 两路归并
            mergeSort(array, start, mid);
            mergeSort(array, mid + 1, end);
            merge(array, start, mid, mid + 1, end);
        }
    }

    public static void main(String[] args) {

        int[] a = { 4, 2, 1, 6, 3, 6, 0, -5, 1, 1 };
        int i;
        mergeSort(a, 0, a.length - 1);
        for (i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }

}

算法分析:
归并排序算法是一种O(n log n)的算法。它的最差时间复杂度、平均时间复杂度、最好时间都是O(n log n)。但是它需要额外的存储空间,这在某些内存紧张的机器上会受到限制。归并算法是由分割和归并两部分组成的,对于分割部分,如果我们使用二分查找,时间是O(n log n),在最后归并的时候,时间是O(n),所以总的时间O(n log n)。
归并排序是稳定排序,空间复杂度为O(n)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值