美文网首页
算法导论——第一部分 基础知识(二)

算法导论——第一部分 基础知识(二)

作者: 辘轳鹿鹿 | 来源:发表于2020-01-18 18:20 被阅读0次

第2章 算法基础

本章介绍一个贯穿本书的算法设计与分析的框架

2.1插入排序

算法思路

插入排序的工作方式像揭牌时排序手中的扑克牌。

使用插入排序来排序手中扑克牌
开始时,我们的左手为空并且桌子上的牌面向下。然后我们每次从桌子上拿走一张牌并将它插入左手中正确的位置
为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。
拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌

伪代码(算法说明)

插入排序伪代码过程命名为INSERTION-SORT,参数是一个数组A[1...n],包含长度为n(n=A.length)的要排序的一个序列。

插入排序伪代码
\\Python 实现
def Insertion_sort(A):
    for j in range(1,len(A)):
        key=A[j]
        i=j-1
        while i>=0 and key<A[i]:
            A[i+1]=A[i]
            i=i-1
        A[i+1]=key
    return A;
A=[5,2,4,6,1,3]
print(Insertion_sort(A))

证明算法的正确性

循环不变式:循环的每次执行前后都为真的谓词
循环不变式的三条性质

初始化:循环的第一次迭代之前,它为真
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。
终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。

插入排序的循环不变式:for 循环的每次迭代开始时,子数组A[1...j-1]由原来在A[1...j-1]中的元素组成,但现在已按序排列。

证明循环不变式的三条性质成立
前两条性质的证明类似于数学归纳法的基始步骤和归纳步骤

初始化:首先证明在第一次循环迭代之前(j=2),循环不变式成立
保持:证明每次迭代保持循环不变式
终止:研究在循环终止时发生了什么。(子数组A[1..n]由原来在A[1..n]中的元素组成,但以按序排列。子数组A[1..n]就是整个数组,我们推断出整个数组已排序。因此算法正确)

相关文章

  • 《算法导论》(第三版)目录

    算法导论(第三版) 第一部分 基础知识 第 1 章 算法在计算中的应用 1.1 算法 1.2 作为一种技术的算法 ...

  • 算法导论——第一部分 基础知识(二)

    第2章 算法基础 本章介绍一个贯穿本书的算法设计与分析的框架 2.1插入排序 算法思路 插入排序的工作方式像揭牌时...

  • 通过学习Python来学会各种编程语言,以及找工作

    国内有部分学校上计算机科学导论时,顺带教Python实现计算机科学导论中讲的算法。 有的大学第一门编程课程是教的P...

  • 算法导论-基础知识-算法入门

    插入排序 问题 输入:n个数(a1,a2,···,an).输出:输入序列的一个排列(即重新排序)(a'1,a'2,...

  • 第一章 绪论

    本系列读书笔记参考自数据结构与算法经典问题解析第二版内容,习题答案部分有误,已勘正,部分严格证明参考算法导论第三版...

  • 插入排序【算法导论】

    注:学习算法导论,按照标准伪代码理解翻译为java实现,如有兴趣理解整个过程的细节,建议阅读《算法导论》第二章:2...

  • 归并排序【算法导论】

    注:学习算法导论,按照标准伪代码理解翻译为java实现,如有兴趣理解整个过程的细节,建议阅读《算法导论》第二章:2...

  • 最大子数组

    最大字数组问题一种java实现,理论部分参见算法导论分治策略

  • 算法导论——第一部分 基础知识(一)

    第一章 算法在计算中的作用 1.1算法 问题陈述 说明了期望的输入\输出关系算法 就是把输入转换成输出的计算步骤的...

  • 算法导论学习笔记(1)

    《算法导论》一共包含两部分,即算法分析和算法设计。 什么是算法分析? “算法分析是关于计算机程序性能和资源利用的理...

网友评论

      本文标题:算法导论——第一部分 基础知识(二)

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