Maktub_Wiki Maktub_Wiki
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
  • 第2章 算法基础

    • 2.1 插入排序
    • 2.2 算法分析
    • 2.3 设计算法
      • 2.3.1 分治法
        • 图解
        • 代码
      • 2.3.2 分析分治算法
  • 第6章 堆排序

    • 6.2 维护堆的性质
    • 6.3 建堆
    • 6.4 堆排序算法
    • 6.5 优先队列
  • 第7章 快速排序

    • 7.1 快速排序的描述
  • 第8章 线性时间排序

    • 8.2 计数排序
    • 8.4 桶排序
  • 第12章 二叉树搜索

    • 12.1 什么是二叉树搜索
    • 12.3 插入和删除
  • 第13章 红黑树

    • 13.1 红黑树的性质
    • 13.2 旋转
  • 第15章 动态规划

    • 15.4 最长公共子序列
  • 第23章 最小生成树

    • 23.2 Kruskal算法和Prim算法
  • 第24章 单源最短路径

    • 24.1 Bellman-Ford算法
    • 24.3 Dijkstra算法
  • 第25章 所有结点对的最短路径问题

    • 25.2 Floyd-Warshall算法
    • 25.3 用于稀疏图的Johnson算法
  • 第31章 数论算法

    • 31.2 最大公约数
    • 31.6 元素的幂
  • 第32章 字符串匹配

    • 32.4 Knuth-Morris-Pratt算法
  • 算法导论
  • 第2章 算法基础
Maktub_小明
2024-08-08
目录

2.3 设计算法

# 2.3.1 分治法

归并排序

将一个问题,一次或多次或多次递归调用自己,分解成若干个子问题后,解决问题

# 图解

# 代码

from typing import List
import math
def merge(A:List[int],p:int,q:int,r:int):
    L = A[p:q+1]+[float('inf')]
    R = A[q+1:r+1]+[float('inf')]
    i = j = 0
    for k in range(p,r+1):
        if L[i] <= R[j]:
            A[k] = L[i]
            i+=1
        else:
            A[k] = R[j]
            j+=1
def merge_sort(A:List[int],p:int,r:int):
    if p < r:
        q = math.floor((p+r)/2)
        merge_sort(A,p,q)
        merge_sort(A,q+1,r)
        merge(A,p,q,r)
param = [5,2,4,7,1,3,2,6]
merge_sort(param,0,len(param)-1)
print(param)

# 2.3.2 分析分治算法

T(n)={c,如果n=12T(n/2)+cn,如果n>1=cnlg⁡n+cnT(n) = \begin{cases} c, & 如果n=1\\2T(n/2)+cn, & 如果n>1\end{cases}\;=\;cn\lg n+cn T(n)={c,2T(n/2)+cn,​如果n=1如果n>1​=cnlgn+cn

上次更新: 2025/08/03, 09:26:17
2.2 算法分析
6.2 维护堆的性质

← 2.2 算法分析 6.2 维护堆的性质→

Theme by Vdoing | Copyright © 2021-2025 Maktub_小明 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式