归并排序(JAVA版)

最近复习算法,为了年后找工作做准备,看了看网上归并排序,只懂算法原理源码没有看懂,算了,还是根据原理手撸吧!!!

如果大家想了解其他两种牛掰的排序,请猛戳下面链接

快速排序 

堆排序

归并排序复杂度O(nlogn)

public class MergeSort {
    public static int arr[] = {2,4,7,8,9,4,5,1,2,3,6,8,7,8,54,4,2,58,47,5,8,4,2,5};
    public static void main(String[] args) {
        sort(arr,0,arr.length-1);   //排序
        print();    //打印
    }

    //拆分
    public static void sort(int left,int right){
        if(left >= right)
            return;
        //递归终止条件,一个子数组只有一个或两个元素
        if(right-left==1){
            if(arr[left]>arr[right]){
                int t = arr[left];
                arr[left] = arr[right];
                arr[right] = t;
            }
            return;
        }
        //递归分解
        int mid = (left + right)/2;
        sort(arr,left,mid);
        sort(arr,mid+1,right);
        //合并
        merge(left,mid,right);
    }
    //合并
    public static void merge(int left,int mid,int right){
        int i = left;
        int j = mid+1;
        int k = 0;
        //开辟临时数组,合并两个有序子数组
        int temp[] = new int[right-left+1];
        while(i<=mid && j<=right){
            if(arr[i]<arr[j]){
                temp[k++] = arr[i++];
            }else{
                temp[k++] = arr[j++];
            }
        }
        while(i<=mid){
            temp[k++] = arr[i++];
        }
        while(j<=right){
            temp[k++] = arr[j++];
        }
        //将临时数组合并到原来数组中
        k = 0;
        for(i = left;i<=right;i++){
            arr[i] = temp[k++];
        }
    }

    /**
     * 打印
     */
    public  static void print(){
        for(int a:arr){
            System.out.print(a+",");
        }
        System.out.println();
    }
}

自己手撸的印象确实比看网上或看书来的深刻

结束,拜拜

猜你喜欢

转载自blog.csdn.net/nuoWei_SenLin/article/details/86667561