java归并排序

概述

归并排序与快速排序相同,同样是借鉴二叉树的思想,时间复杂度O(n),与快速排序一样是大量数据排序的最优方式之一。

思路分析

归并排序是将目标数组分成左右两个数组,左右两个数组必须是有序的,然后对这两个数组合并从而实现排序。对于任意的数组都可以将所有的数据分成若干个数组,每个数组中都只有一个元素,然后两两合并。(因此,归并排序的内存开销会比快速排序多)

代码实现

  private void mergeSort(int[] array, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = (left + right) >> 1;
        mergeSort(array, left, mid);
        mergeSort(array, mid + 1, right);
        merge(array, left, mid + 1, right);
    }

    private void merge(int[] array, int left, int mid, int right) {
        int leftSize = mid - left;
        int rightSize = right - mid + 1;
        int[] leftArray = new int[leftSize];
        int[] rightArray = new int[rightSize];
        System.arraycopy(array, left, leftArray, 0, leftSize);
        System.arraycopy(array, mid, rightArray, 0, rightSize);
        int index=left;
        int leftIndex = 0;
        int rightIndex = 0;
        while (leftIndex<leftSize&&rightIndex<rightSize){
            if(leftArray[leftIndex]<rightArray[rightIndex]){
                array[index++] = leftArray[leftIndex++];
            }else {
                array[index++] = rightArray[rightIndex++];
            }
        }
        while (leftIndex<leftSize){
            array[index++] = leftArray[leftIndex++];
        }
        while (rightIndex<rightSize){
            array[index++] = rightArray[rightIndex++];
        }
    }

测试代码

 @Test
    public void testMergeSort() {
        int[] array = new int[]{1, 3, 4, 10, 2, 5, 6, 9, 7, 8};
        mergeSort(array, 0, array.length - 1);
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

结果打印

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

推荐阅读更多精彩内容

  • 一. 概念 归并的含义是将两个或两个以上的有序表合并成一个新的有序表。大体分成,两路归并排序,和多路归并排序。用于...
    丶阿颜阅读 8,668评论 0 11
  • 面试 11:Java 玩转归并排序 前面讲了冒泡、选择、插入三种简单排序,时间复杂度都是 O(n²),今天,我们终...
    nanchen2251阅读 5,055评论 1 11
  • 归并排序什么是归并排序:图解归并排序归并排序有两种实现方式,一是基于递归,而是基于迭代1)基于递归的归并排序: 基...
    何甜甜在吗阅读 2,578评论 0 1
  • 通过前面的知识,我们已经知道,有序的数据在查找时有极大的性能提升。很多查找都基于有序数据,但并不是所有的结构都能像...
    大大纸飞机阅读 4,895评论 0 1
  • 五一过得开心吗?有没有什么小确幸要和大家分享? 今天是一个惊喜。看着猫叔的话,听着猫叔的歌,眼泪不停地流,终于遇到...
    MsCactus阅读 1,098评论 0 0