【算法导论】笔记-第一章 算法基础

第1章 算法基础

1.1 插入排序

  • 关键词:我们要排序的数。

  • 伪代码:我们使用最清晰,最简洁的表示方法来说明给定的算法。

    • 约定
      • 缩进表示块结构
      • while,for与repeat-until等循环结构以及if-else等条件结构与代码类似
      • //:表示该行后面部分是个注释
      • i=j=e:将e的值赋给变量i和j
      • 数组元素通过“数组名[下标]”的形式来访问
      • 复合数据通常被组织成对象,对象又由属性组成
      • 我们按值把参数传递给过程
  • INSERTION-SORT:插入排序的伪代码过程。

    for j = 2 to A.length
        key = A[j]
        //Insert A[j] into the sorted sequence A[1..j-1].
        i = j - 1
        while i > 0 and A[i] > key
            A[i+1] = A[i]
            i = i - 1
        A[i+1] = key
    

    A[1…n]:包含长度为n的要排序的一个序列。

    A.length:A中元素的数目n

  • 循环不变式:

    • 性质:
      • 初始化:循环之前它为真
      • 保持:下次迭代依然为真
      • 终止:循环终止时,不变式为我们提供有用的性质
  • python代码:

    def insert_sort(mylist):
        length = len(mylist) #获取列表长度
        for i in range(1,length):
             j = i - 1 #设置当前值前一个元素的标识    
             if(mylist[i] < mylist[j]): #如果当前值小于前一个元素,则将当前值作为一个临时变量存储,将前一个元素后移一位
                 temp = mylist[i]
                 mylist[i] = mylist[j]
                 j = j-1 #继续往前寻找,如果有比临时变量大的数字,则后移一位,直到找到比临时变量小的元素或者达到列表第一个元素
                 while j>=0 and mylist[j] > temp:
                     mylist[j+1] = mylist[j]
                     j = j-1
                 mylist[j+1] = temp #将临时变量赋值给合适位置
        return mylist
     
    mylist = [49,38,65,97,76,13,27,49]
    print(insert_sort(mylist))
    

1.2 分析算法

  • 输入规模:概念:输入规模的最佳概念依赖于研究的问题。

    问题 量度
    排序,计算离散傅里叶变换 输入中的项数
    两个整数相乘 用二进制记号表示输入所需的总位数
    输入是一个图 该图的顶点数和边数
  • 运行时间:是指执行的基本操作数或步数

  • 增长量级: θ ( n 2 ) \theta(n^2) θ(n2)

  • 插入排序的最坏情况运行时间: T ( n ) = θ ( n 2 ) T(n)=\theta(n^2) T(n)=θ(n2)

1.3 设计算法

1.3.1 分治法

  • 思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,再合并这些子问题的解来建立原问题的解。
  • 步骤:**分解,解决,合并

你可能感兴趣的:(算法导论,算法,数据结构,算法导论)