归并排序

2017-12-12  本文已影响0人  Oceans言欢

闲来无事,总结一下排序算法,感觉快要忘光啦。

public static void mergeSort(int[] arr, int low,int high){
        if(low < high){
            int mid = low + (high - low)/2;
            mergeSort(arr,low,mid);
            mergeSort(arr,mid+1,high);
            merge(arr,low,mid,high);
        }
    }
    public static void merge(int[] arr, int low,int mid,int high){

        int[] temp = new int[high-low+1];
        int i = low,j = mid+1,k = 0;
        while(i <= mid && j <= high){
            if(arr[i] < arr[j]){
                temp[k++] = arr[i++];
            }else{
                temp[k++] = arr[j++];
            }
        }
        while(i<=mid){
            temp[k++] = arr[i++];
        }
        while(j <= high){
            temp[k++] = arr[j++];
        }
        for(k = 0;k<temp.length;k++){
            arr[low+k] = temp[k];//很容易出问题
        }
    }

对几个关键性质进行分析:

时间复杂度:
归并排序的时间复杂度为O(nlogn)。主要从两个方面进行分析:1.数组的划分 2.数组的有序归并。
对于一趟归并排序,会将数组中所有数字都扫描一遍,因此会耗费O(n)。归并排序过程类似一个完全二叉树,根据二叉树的性质,整个归并排序会进行logn次。因此总的时间复杂度为O(nlogn)。
对于长度为n的数组,需要进行logn次二路归并,每次归并时间为O(n),因此最优时间复杂度和最差时间复杂度都为O(nlogn)。
空间复杂度:
空间复杂度为O(n)

稳定性:
归并排序是一种稳定的排序算法,因为存在if(arr[i] < arr[j]),在归并过程中不会改变元素的相对位置。

总结:
归并排序是一种比较占用内存,但是效率非常高并且稳定的排序算法。
在内部排序中不会使用该算法,外部排序才会考虑使用这种方法。

上一篇下一篇

猜你喜欢

热点阅读