栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多路归并排序算法(二分归并排序算法)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多路归并排序算法(二分归并排序算法)

归并排序是基于分治的思想,是稳定排序
分(divide)的阶段:分成一些小的问题然后递归求解,时间复杂度为O(log2n)
治(conquer)的阶段:则将分的阶段得到的各答案"合并"在一起,时间复杂度为cn)

总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

递归

     *  long f(int n){
     *      if(n=1){
     *          return 1;
     *      }
     *      return n+f(n-1);
     *  }
第一版,merge方法中把定义了两个临时数组来进行合并
public class MergeSort {


    public static void main(String[] args) {
        //{1, 7, 5,3, 8 ,2, 4,6, 9};
        int arr[] = {7, 1, 5,3};
        int left = 0;
        int right = 3;
        sort(arr, left, right);
        System.out.println("===============");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    
    public static void sort(int arr[], int left, int right) {
        
        if (right == left) {
            return;
        }
        int mid = (left + right) / 2;
        
        sort(arr, left, mid);
        
        sort(arr, mid + 1, right);
        
        merge(arr, left, mid + 1, right);
    }

    
    public static void merge(int arr[], int left, int mid, int right) {
        int leftSize = mid - left;
        int rightSize = right - mid + 1;
        int leftArr[] = new int[leftSize];
        int rightArr[] = new int[rightSize];

        

        for (int i = left; i < mid; i++) {
            leftArr[i-left] = arr[i];
        }
        
        for (int i = mid; i < right+1; i++) {
            rightArr[i - mid] = arr[i];
        }
        
        int i = 0, j = 0, k = left;
        
        while (i < leftSize && j < rightSize) {
            if (leftArr[i] < rightArr[j]) {
                arr[k++] = leftArr[i++];
            } else {
                arr[k++] = rightArr[j++];
            }
        }
        
        while (i < leftSize) {
            arr[k++] = leftArr[i++];
        }
        
        while (j < rightSize) {
            arr[k++] = rightArr[j++];
        }
    }


}

第二版,merge方法中把定义了一个临时数组,但需要回写原数组
public class MergeSort_V2 {


    public static void main(String[] args) {
        //{1, 7, 5,3, 8 ,2, 4,6, 9};
        int arr[] = {1, 7, 5,3, 8 ,2, 4,6};
        int left = 0;
        int right = 7;
        sort(arr, left, right);
        System.out.println("===============");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    
    public static void sort(int arr[], int left, int right) {
        
        if (right == left) {
            return;
        }
        int mid = (left + right) / 2;
        
        sort(arr, left, mid);
        
        sort(arr, mid + 1, right);
        
        merge(arr, left, mid + 1, right);
    }

    
    public static void merge(int arr[], int left, int mid, int right) {


        
        int[] tmp=new int[right-left+1];

        
        int i = left, j = mid, k = 0;
        
        while (i 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773641.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号