认识O(NlogN)的排序(一)

简介: 认识O(NlogN)的排序(一)

求中点:mid=L+(R-L)>>1


1687268755404.png


递归


在范围内求最大值:


1687268744088.png


递归行为时间复杂度估算:master公式


1687268762701.png


归并排序


归并排序:将数组分成两部分,分别对两部分进行排序,将排好序的两部分利用双指针合并成一个数组(需要一个外部空间),最后将外部空间的数组拷贝到原数组中。对每部分的排序采用递归的方式进行。

代码实现:


public class MergeTest {
    public static void main(String[] args) {
        int[] arr={2,3,5,1,7,4};
        //测试
        process(arr,0,arr.length-1);
        for (int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }
    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){
        //定义一个辅助空间用来存放merge后的数组
        int[] help=new int[R-L+1];
        int i=0,p1=L,p2=M+1;
        //都不越界
        while (p1<=M && p2<=R){
            //双指针,如果左侧小于等于右侧,就把左侧数据放入辅助空间中,反之亦然
            help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
        }
        //左侧未越界,说明右侧越界了,则把左侧剩余的数据直接放到辅助空间
        while (p1<=M){
            help[i++]=arr[p1++];
        }
        //同理,两个while只会执行一个
        while (p2<=R){
            help[i++]=arr[p2++];
        }
        //从L开始
        for (int j=0;j< help.length;j++){
            arr[L+j]=help[j];
        }
    }
}


合并有序数组

力扣T88

题目描述:


1687268772622.png


题解:


class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1=0,p2=0;
        int res[m+n];
        int cur;
        while(p1<m || p2<n){
            if(p1==m){
                cur=nums2[p2++];
            }else if(p2==n){
                cur=nums1[p1++];
            }else if(nums1[p1]<nums2[p2]){
                cur=nums1[p1++];
            }else{
                cur=nums2[p2++];
            }
            res[p1+p2-1]=cur;
        }
        for(int i =0;i!=m+n;i++){
            nums1[i]=res[i];
        }
    }
};


相关文章
|
存储 算法 搜索推荐
排序篇(四)----归并排序
排序篇(四)----归并排序
60 0
|
11月前
|
算法 搜索推荐 大数据
【算法】排序——归并排序和计数排序
上两篇文章讲解了插入排序、选择排序以及交换排序,每种类型的排序大类下都有一到两种排序,今天给大家带来的是归并排序,和前面几种排序一样都属于比较排序中的一种,是通过比较数组中的元素来实现排序的,还给大家带来一种非比较排序计数排序,让我们开始今天的排序之吧!!!
|
6月前
|
算法 搜索推荐
排序——归并排序
排序——归并排序
43 0
|
存储 搜索推荐 测试技术
排序篇(一)----插入排序
排序篇(一)----插入排序
46 0
认识O(NlogN)的排序(二)
认识O(NlogN)的排序(二)
56 0
|
存储 算法 搜索推荐
排序(4)——归并排序
今天给大家带来比较排序的最后一种,归并排序,这个排序,需要我们对递归,循环控制要有着较强的理解,我相信大家通过前面和小编的一起学习,这里肯定也是得心应手。
96 0
|
算法 搜索推荐
排序——归并排序和计数排序
介绍归并排序和计数排序
109 0
排序——归并排序和计数排序
|
算法
排序——快速排序
排序——快速排序
119 0
排序——快速排序
|
算法 Java
排序系列之插入排序
排序系列之插入排序
126 0
|
移动开发 自然语言处理 算法
排序——归并排序 & 基数排序
排序——归并排序 & 基数排序
167 0
排序——归并排序 & 基数排序