归并排序

归并排序的时间复杂度是O(nlogn),优与选择排序以及冒泡排序,采用的思想就是分治思想,先分,将要排序的数组一分为二,然后再治,就是合并,下面直接从代码上看:

 private void mergeSort(int[] oriArray){
        int[] tempArray = new int[oriArray.length];
        mergeSort(oriArray, tempArray, 0, oriArray.length -1);
    }

    private void mergeSort(int[] oriArray, int[] tempArray, int left, int right){
        if (left < right){
            int center = (left + right )/2;
            mergeSort(oriArray, tempArray, left, center);
            mergeSort(oriArray, tempArray, center +1, right);
            merge(oriArray, tempArray, left, center + 1, right);
        }
    }

    private int[] merge(int[] oriArray, int[] tempArray, int leftStart, int rightStart, int rightEnd){
        int leftEnd = rightStart -1;
        int tempStart = leftStart;
        int totalNum = rightEnd - leftStart + 1;
        while (leftStart <= leftEnd && rightStart <= rightEnd){
            if (oriArray[leftStart] <= oriArray[rightStart]){
                tempArray[tempStart] = oriArray[leftStart];
                leftStart++;
            } else {
                tempArray[tempStart] = oriArray[rightStart];
                rightStart ++;
            }
            tempStart ++;
        }

        while (leftStart <= leftEnd ){
            tempArray[tempStart] = oriArray[leftStart];
            tempStart ++;
            leftStart ++;
        }

        while (rightStart <= rightEnd){
            tempArray[tempStart] = oriArray[rightStart];
            tempStart ++;
            rightStart ++;
        }

        //为什么用rightEnd赋值,因为在合并的过程中,rightEnd的值没有变化,rightEnd表示的数组位置也是原数组的数组位置。leftStart和rightStart是用来标记合并时的两个数组的位置的。
        for (int i = 0;i< totalNum;i++, rightEnd --){
            oriArray[rightEnd] = tempArray[rightEnd];
        }

        return oriArray;
    }

总之,归并排序就是先分后治,不断的递归调用直到两个元素的时候,再又一层一层的往上合并。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 归并排序: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,...
    4ffde5305e8f阅读 22,900评论 6 20
  • 讨厌算法的程序员系列入口 分而治之 从算法设计的分类上来说,插入排序属于增量方法。在排序好子数组A[1 ‥ j-1...
    袁承兴阅读 4,709评论 0 2
  • 简介 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-...
    尼小摩阅读 5,055评论 0 1
  • 数据结构与算法--归并排序 归并排序 归并排序基于一种称为“归并”的简单操作。比如考试可能会分年级排名和班级排名,...
    sunhaiyu阅读 4,446评论 0 6
  • 刚加完班回来,虽然也快12点了。没有周围同事口中那般不羁的抱怨,唯一有点的好像也是从加班中窥探到了什么。我把原来晚...
    回希阅读 1,868评论 2 2

友情链接更多精彩内容