美文网首页
数据结构与算法二:认识O(NlogN)的排序

数据结构与算法二:认识O(NlogN)的排序

作者: 菜鸟养成记 | 来源:发表于2021-07-04 00:49 被阅读0次

1、递归算法

用递归算法求数组 arr[] 中的最大值 N
程序实现:

public class Code08_GetMax {
    public static void main(String[] arr){
        int[] arrs = {2,3,5,1,4,6};
        System.out.println(getMax(arrs));

    }

    public static int getMax(int[] arr){
        return process(arr, 0, arr.length -1);
    }
    //arr[L..R]范围上求最大值     N
    public static int process(int[] arr, int L, int R){
        if(L == R){ // arr[L..R]范围上只有一个数,直接返回
            return arr[L];
        }
        int mid = L + ((R - L) >> 1); // 中点
        int leftMax = process(arr, L, mid);
        int rightMax = process(arr, mid + 1,R);
        return Math.max(leftMax, rightMax);
    }
}

递归逻辑图解如下图所示:

递归算法图解.png
master公式求解递归时间复杂度: master公式.png

2、归并排序

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

1)整体就是一个简单递归,左边排好序、右边排好序、让其整体有序
2)让其整体有序的过程里用了排外序方法
3)利用master公式来求解时间复杂度
4)归并排序的实质

时间复杂度O(N*logN),额外空间复杂度O(N)

归并排序算法实现:java

import java.util.Arrays;

public class Code01_MergeSort {

    public static void main(String []args){ //主函数
        int []arr = {9,8,7,6,5,4,3,2,1};
        mergeSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void mergeSort(int[] arr){  //归并排序
        if (arr == null || arr.length < 2){
            return;
        }
        process(arr, 0, arr.length - 1);
    }

    public static void process(int[] arr, int L, int R){  //分
        if(L == R){
            return;
        }
        int mid = L + ((R - L) >> 1);
        process(arr, L, mid);
        process(arr, mid + 1, R);
        merge(arr, L,mid, R); //将两个有序子数组合并
    }

    public static void merge(int[] arr, int L, int M, int R){ //合并
        int[] help = new int[R - L + 1];
        int i = 0;
        int p1 = L; //左序列指针
        int p2 = M + 1; //右序列指针
        while(p1 <= M && p2 <= R){
            help[i++] = arr[p1] <= arr[p2] ? arr[p1++]:arr[p2++];
        }
        while(p1 <= M){ //将左边剩余元素填充进help中
            help[i++] = arr[p1++];
        }
        while(p2 <= R){ //将右序列剩余元素填充进help中
            help[i++] = arr[p2++];
        }
        for (i = 0; i < help.length; i++){ //将排好序的数组回写到原数组
            arr[L + i] = help[i];
        }
    }
}

相关文章

  • 数据结构与算法二:认识O(NlogN)的排序

    1、递归算法 用递归算法求数组 arr[] 中的最大值 N程序实现: 递归逻辑图解如下图所示: 2、归并排序 归并...

  • 算法之我见(II)

    5.数据结构和算法的关系 1.常见数据结构 线性结构:对应数组,下标访问O(1),排序最快O(nlogn),也有O...

  • 2020-11-19 排序算法一(冒泡和快排多种实现)

    主流的排序算法 时间复杂度为O(n^2):冒泡排序选择排序插入排序希尔排序(介于O(n^2)与O(nlogn)之间...

  • 高级排序算法(一)

    O(nlogn)的排序算法 我们先来看看nlogn比n2快多少? 归并排序(Merge Sort) 算法思想:假定...

  • 数据结构与算法--排序-O(nlogn)

    总结: 归并排序, 快速排序 时间复杂度 O(nlogn). 冒泡排序、插入排序、选择排序这三种排序算法,它们的时...

  • 算法笔记:快排算法与归并排序

    快排算法与归并算法时间复杂度都是O(nlogn)的排序算法。适合大规模的数据排序。思想利用的是分治思想。 归并排序...

  • 6. 归并排序

    归并排序:算法时间复杂度O(nlogn) 空间复杂度O(n) 算法实现

  • 排序

    本文讲数组的排序,排序复杂度分为O(n²)和O(nlogn)。其中:O(n²)的算法有:插入排序[https://...

  • 基于比较的排序

    一、排序算法定义 本章介绍是基于比较的排序算法,这类排序算法的理论最优时间复杂度是O(NlogN)。 各类排序算法...

  • 数组里最小的k个元素&&快排

    这个题目之前在看数据结构和算法分析的时候见过,其实解法也挺多的。 排序后找出前k个元素快排O(NlogN),然后O...

网友评论

      本文标题:数据结构与算法二:认识O(NlogN)的排序

      本文链接:https://www.haomeiwen.com/subject/bofmultx.html