美文网首页
归并排序(Java版)

归并排序(Java版)

作者: lkmc2 | 来源:发表于2018-01-09 01:03 被阅读54次

归并排序:当数组只有四个元素的时候可以这样定义归并排序,将数组平均分成两半,分别是左区间和右区间,将左区间、右区间分别排序好之后,再将这两个有序的区间进行合并,成为一个有序的数组。

实际上的归并排序会不断将各个区间平均分成两半,直到每个区间只剩一个元素为止,再将相邻的两个有序区间合并成一个新的有序区间,直到所有区间都合并完为止。

归并排序的最好、最坏和平均时间复杂度都是O(nlogn)。

/**
 * Created by lkmc2 on 2018/1/9.
 */
public class MergeSort {
    /**
     * 归并排序
     * @param array 原数组
     * @param left 左起点
     * @param right 右终点
     */
    public static void mergeSort(int[] array, int left, int right) {
        //如果区间只有一个元素或者没有元素,结束函数
        if (left >= right) return;

        //获取该区间的中间值
        int mid = (left + right) / 2;
        //将区间平均分成两半,对左区间进行归并排序
        mergeSort(array, left, mid);
        //对右区间进行归并排序
        mergeSort(array, mid + 1, right);

        //如果归并排序后的左区间与右区间未有序
        if (array[mid] > array[mid + 1]) {
            //将左区间与右区间合并形成有序数组
            merge(array, left, mid, right);
        }
    }

    /**
     * 合并两个区间
     * @param array 原数组
     * @param left 左起点
     * @param mid 中间点
     * @param right 右终点
     */
    public static void merge(int[] array, int left, int mid, int right) {
        //用来存储原数据的临时数组
        int[] temp = new int[right - left + 1];

        //将原数据拷贝到临时数组
//        System.arraycopy(array, left, temp, 0, right - left + 1);
        for (int i = left; i <= right; i++) {
            temp[i - left] = array[i];
        }

        //i为左区间起点,j为右区间起点
        int i = left, j = mid + 1;
        for (int k = left; k <= right; k++) {
            if (i > mid) { //左区间的数已存完
                array[k] = temp[j - left]; //将右区间剩下的数存到数组
                j++; //右区间下标移动
            } else if (j > right) { //右区间的数已存完
                array[k] = temp[i - left]; //将左区间剩下的数存到数组
                i++; //左区间下标移动
            } else if (temp[i - left] < temp[j - left]) { //左区间的值小于右区间
                array[k] = temp[i - left]; //将左区间的值存入数组
                i++; //左区间下标移动
            } else { //右区间的值小于左区间
                array[k] = temp[j - left];
                j++; //右区间下标移动
            }
        }
    }

    public static void main(String[] args) {
        int[] array = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

        mergeSort(array, 0, array.length - 1); //归并排序

        for (int num : array) {
            System.out.print(num + " ");
        }
    }
}
运行结果

相关文章

  • 归并排序

    归并排序Java实现

  • 归并排序

    归并排序 代码实现(java):

  • 归并排序(Java版)

    归并排序:当数组只有四个元素的时候可以这样定义归并排序,将数组平均分成两半,分别是左区间和右区间,将左区间、右区间...

  • 归并排序 --- Java版

    算法思路 把待排序List中间切分成2段,而且是递归切分,直到子List元素只有1个结束。 把切分好的子List,...

  • 常用排序算法的Java实现

    冒泡、插入、选择、归并、快速排序的Java实现

  • 归并排序

    自顶向下的归并排序 java描述

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • Java代码实现归并排序

    Java代码实现归并排序 归并排序(Merge Sort) 思路:如果要排序一个数组,我们先把数组从中间分成前后两...

  • 快排 、 归并排序----复习

    分治思想在归并排序之中可以很好地体现出来。 归并排序: 下面是程序java static public void...

  • 多线程归并排序 go实现

    特性 线程数可以调整 混合使用归并排序的递归版和非递归版实现减少递归调用损耗 线程利用率高 不足:归并排序的mer...

网友评论

      本文标题:归并排序(Java版)

      本文链接:https://www.haomeiwen.com/subject/xkoinxtx.html