代码先锋网 代码片段及技术文章聚合

八大排序系列之「归并排序」

技术标签: 算法与数据结构  排序算法  算法  java

关于归并排序的原理这里不再赘述,直接附上代码

Java实现如下

public class Solution6 {

    public static void  mergeSort(int[] arr){
        int[] tempArr = new int[arr.length];
        sort(arr,tempArr,0,arr.length-1);
    }

    private static void sort(int[] arr,int[] tempArr,int startIndex,int endIndex){
        if(endIndex <= startIndex) return;
        int middleIndex = startIndex + (endIndex - startIndex) / 2;

      	//分解
        sort(arr, tempArr, startIndex, middleIndex);
        sort(arr, tempArr, middleIndex + 1, endIndex);

      	//归并
        merge(arr, tempArr, startIndex, middleIndex, endIndex);
    }

    private static void merge(int[] arr, int[] temArr, int staIndex, int midIndex, int endIndex){
        for(int i = staIndex; i <= endIndex; i++) temArr[i] = arr[i];
        int left = staIndex;
        int right = midIndex+1;
        for(int i=staIndex; i<=endIndex; i++){
            if(left > midIndex) arr[i] = temArr[right++];
            else if(right > endIndex) arr[i] = temArr[left++];
            else if(temArr[right] < temArr[left]) arr[i] = temArr[right++];
            else  arr[i] = temArr[left++];
        }
    }
}

时间复杂度: O(nlogn)
空间复杂度: O(1)

补充:
arr[i++];arr[i]i自增
arr[++i];i自增再arr[i]

版权声明:本文为weixin_44471490原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44471490/article/details/108590459

智能推荐

八大排序算法(四)——归并排序

要将一个数组排序,可以先将它分成两半分别排序,然后将结果归并起来。这就是归并排序。归并排序的主要优势是它能保证将任意长度为n的数组排序所需时间与nlogn成正比,它的主要缺点则是它所需的额外空间与n成正比。 4.1 自顶而下的归并 该方法先将所有元素复制到aux[]中,然后再归并到a[]中。方法在归并时用到4个条件判断:左半边用尽取右半边的元素,右半边用尽取左半边元素,右半边当前元素小于左半边当前...

八大排序——归并排序

归并排序 基本理解 归并排序利用了分治法,将序列分为若干个子序列,两两一组进行排序合并。 大致过程为:将长度为n的序列分成n个组,然后两两进行排序合并,即第1个和第2个比较大小合并成一组,第3个和第4个比较大小合并为一组……这样一趟下来从一开始的n个组变为了n/2组,继续将合并后的第1组和第2组比较大小排序进行合并……第二趟下来变为n/4个组...

八大排序算法-归并排序

归并排序的定义: 是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 归并排序的基本思想: 设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。 1、j=m+1;k=i;i=i; 置两个子表的起始下标及辅助数组的起始...

八大排序----归并排序

归并排序是一种很稳定,很快的排序,时间复杂度为O(nlogn),作者很喜欢这个排序 大概思想就是分治,每次找一半,直到就剩一左一右两个元素,比如说{4,8,6,2,3,7} 递归找到最左面的也就是 {4,8}发现有序,然后回溯找右面的发现右面不够两个,再回溯也就是{4,8,6}合并,即{4,8}和{6}合并,取一个temp数组,用来存储合并后有序的这个数组,取左数组和右数组的头,遵循一个思想,谁小...

猜你喜欢

八大排序——归并排序

归并排序(Merge sort) 定义 归并排序时建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用,归并排序的实现有两种方法: 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法) 自下而上的迭代 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。...

八大排序之选择排序、堆排序、归并排序

【选择排序(Selection Sort)】 选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的元素中选出最小(或最大)的一个元素,与已排序序列的后一个位置进行交换,使得已排序的序列长度+1,重复操作直到没有元素待排序。  排序过程如下: 原序列:6     8     1     4...

(C语言)八大排序之:归并排序

归并排序 mergeSort,分治策略。reference: http://www.cnblogs.com/chengxiao/p/6194356.html...