22.1.7 master公式及O(NLogN)的排序

1 master 公式

(1) 写公式
  • T(N) = a * T(N/b) + O(N^d);

  • master公式用来求递归行为的时间复杂度,式中T(N/b)表示母问题被分解为子问题的规模,a表示子问题被调用的次数,O(N^d)表示算法中其他过程的时间复杂度。

    例如:

    public static int getMax(int[] arr)
    {
       return process(arr,0,arr.length-1);
    }

    public static int process(int[] arr,int L,int R)
    {
       if(L==R)
           return arr[L];
       int mid = L+((R-L)>>1);//mid = L+((R-L)/2),/2可以表示为右移一位。
       int leftMax = process(arr,L,mid);
       int rightMax = process(arr,mid,R);
       return Math.max(leftMax,rightMax);
    }
  • 其中,T(N) = 2 * T(N/2) + O(1);a = 2,b = 2,d = 0;

(2)求时间复杂度:
  • log以b为底a的对数 < d , 时间复杂度为O(N^d);

  • log以b为底a的对数 > d , 时间复杂度为O(N^log以b为底a的对数);

  • log以b为底a的对数 = d , 时间复杂度为O((N^d) * logN);

2 O(NLogN)的排序:

(1) 归并排序:

public static void main(String[] args)
{
int[] arr = {2,4,6,4,6,7,1,8,3,9,8};
process(arr,0,arr.length-1);
for(int cur:arr)
{
System.out.print(cur+" ");
}
}

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);
mergeSoft(arr,L,mid,R);
}

public static void mergeSoft(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[i++] = arr[p1++];
while(p2<=R)
help[i++] = arr[p2++];
for(i=0;i<help.length;i++)
arr[L+i] = help[i];
}

example:小和问题,求逆序对

  • 小和问题描述:对于一个数组例如,2,1,5,8,9,6,3,4。其中2和5,8,9,6,3,4都会产生小和2,同理1与5,8,9,6,3,4也都会产生小和1,依次累加所有的小和然后返回。

//小和问题
public static void main(String[] args)
{
int[] arr = { 2,1,5,8,9,6,3,4};
int res = smallSum(arr);
System.out.println(res+" ");
}

public static int smallSum(int[] arr)
{
if(arr == null || arr.length<2)
return  -1;
return process(arr,0,arr.length-1);
}

public static int process(int[] arr,int L,int R)
{
if(L==R)
return 0;
int mid = L+((R-L)>>1);
return process(arr,L,mid)+process(arr,mid+1,R)+mergeSoft(arr,L,mid,R);
}

public static int mergeSoft(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;
int res = 0;
while(p1<=M && p2<=R)
{
res +=arr[p1]<arr[p2]?((R-p2+1)*arr[p1]):0;
help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=M)
help[i++] = arr[p1++];
while(p2<=R)
help[i++] = arr[p2++];
for(i=0;i<help.length;i++)
arr[L+i] = help[i];
return res;
}

(2) 快速排序

public static void main(String[] args)
{
int[] arr = { 2,1,5,8,9,6,3,4};
quickSort(arr,0,(arr.length-1));
}

public static void swap(int[] arr ,int l,int r)
{
int temp = arr[r];
arr[r] = arr[l];
arr[l] = temp;
}

public static void quickSort(int[] arr,int l,int r)
{
if(l<r)
{
swap(arr,l+(int)(Math.random()*(r-l+1)),r);
int[] p =partition(arr,l,r);
quickSort(arr,l,p[0]-1);
quickSort(arr,p[1]+1,r);
}
}

public static int[]  partition(int[] arr,int l,int r)
{
int less = l-1;
int more = r;
while(l<more)
{
if(arr[l]<arr[r])
{
swap(arr,++less,l++);
}
else if(arr[l]>arr[r])
{
swap(arr,--more,l);
}
else
l++;
}
    swap(arr,more,r);
    return new int[]{less+1,more};
}

22.1.7 master公式及O(NLogN)的排序的更多相关文章

  1. Master公式计算递归时间复杂度

    我们在算递归算法的时间复杂度时,Master定理为我们提供了很强大的便利! Master公式在我们的面试编程算法中除了BFPRT算法的复杂度计算不了之外,其他都可以准确计算! 这里用求数组最大值的递归 ...

  2. 算法初级面试题01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题

    虽然以前学过,再次回顾还是有别样的收获~ 认识时间复杂度 常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作. 时间复杂度为一个算法流程中,常数操作数量的指标.常 ...

  3. 数据结构与算法学习(二)——Master公式及其应用

    本篇文章涉及公式,由于博客园没有很好的支持,建议移步我的CSDN博客和简书进行阅读. 1. Master公式是什么? 我们在解决算法问题时,经常会用到递归.递归在较难理解的同时,其算法的复杂度也不是很 ...

  4. 左神算法第一节课:复杂度、排序(冒泡、选择、插入、归并)、小和问题和逆序对问题、对数器和递归(Master公式)

    第一节课 复杂度 排序(冒泡.选择.插入.归并) 小和问题和逆序对问题 对数器 递归 1.  复杂度 认识时间复杂度常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数 ...

  5. 转:master公式(主方法)

    master公式(也称主方法)是利用分治策略来解决问题经常使用的时间复杂度的分析方法,(补充:分治策略的递归解法还有两个常用的方法叫做代入法和递归树法),众所众知,分治策略中使用递归来求解问题分为三步 ...

  6. 备战秋招之十大排序——O(nlogn)级排序算法

    时间复杂度O(nlogn)级排序算法 五.希尔排序 首批将时间复杂度降到 O(n^2) 以下的算法之一.虽然原始的希尔排序最坏时间复杂度仍然是O(n^2),但经过优化的希尔排序可以达到 O(n^{1. ...

  7. 数据结构与算法——认识O(NlogN)的排序(1)

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

  8. 时间复杂度为O(nlogn)的排序算法

    时间复杂度为O(nlogn)的排序算法(归并排序.快速排序),比时间复杂度O(n²)的排序算法更适合大规模数据排序. 归并排序 归并排序的核心思想 采用"分治思想",将要排序的数组 ...

  9. master公式 ------ 求递归情况下的时间复杂度

    剖析递归行为和递归行为时间复杂度的估算一个递归行为的例子T(N) = a*T(N/b) + O(N^d)1) log(b,a) > d -> 复杂度为O(N^log(b,a))2) log ...

随机推荐

  1. [LeetCode]9.回文数(Java)

    原题地址: palindrome-number 题目描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都 ...

  2. ajax的发展

    ajax(Asynchronous Javascript and XML)异步javascrip和XMl. ajax只是一种web交互方法.在客户端(浏览器)和服务区段之间传输少量的信息.从而为用户提 ...

  3. 基于containerd二进制部署k8s-v1.23.3

    文章目录 前言 k8s 组件 环境准备 创建目录 关闭防火墙 关闭selinux 关闭swap 开启内核模块 分发到所有节点 启用systemd自动加载模块服务 配置系统参数 分发到所有节点 加载系统 ...

  4. 原来VIM还可以这样玩

    文章目录 配置文件vimrc vim 状态栏 状态栏配置内容 状态栏常用信息 显示状态栏 终端安全色 vimrc 配置文件 推荐 vi/vim命令大全 vim参阅 配置文件vimrc 在vim文件中执 ...

  5. 报表工具和BI商业智能的区别,你真的弄清楚了吗?

    许多人在投身大数据行业的时候,肯定会听到的两个词就是"报表工具"和"BI商业智能".但是大部分人并不太清楚这两者之间的概念和区别,认为报表就是BI,BI就是报表 ...

  6. 当TIME_WAIT状态的TCP正常挥手,收到SYN后…

    摘要:今天就来讨论下这个问题,在TCP正常挥手过程中,处于TIME_WAIT状态的连接,收到相同四元组的SYN后会发生什么? 本文分享自华为云社区<在TIME_WAIT状态的TCP连接,收到SY ...

  7. starter

    传统的 Spring 项目想要运行,不仅需要导入各种依赖,还要对各种 XML 配置文件进行配置,十分繁琐,但 Spring Boot 项目在创建完成后,即使不编写任何代码,不进行任何配置也能够直接运行 ...

  8. Oracle数据库的一些常用命令

    转至:https://blog.csdn.net/qq_36843413/article/details/81409152?utm_medium=distribute.pc_relevant_t0.n ...

  9. 60天shell脚本计划-7/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月26日 --修改时间:2021年3月2日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

  10. WPS:将题注与章节连接起来

    右键图片添加题注,在题注设置中勾选题注编号中的包含章节编号