《算法导论》第二章 算法基础 个人心得——从插入排序到初识分治法

算法基础

写在前面的废话 :

  1. 这是我基于算法导论(第三版)这本书写的第一篇心得。我写博客完全是随缘的状态,想写什么写什么。正好最近开始看《算法导论》,于是就以此书为基础,将在我学习过程中的所见所闻、心得体会写在博客之中。一方面为同样在学习这本书的人提供一个参考,另一方面也让我自己可以清楚的梳理脉络,提高学习效率——个人认为,学习的最有效率的方法是讲出来。当你能给别人讲明白时,说明自己也明白了。为什么不从第一章开始写???因为第一章主要是概念类的东西,看看就好,此处不赘述。

  2. 《算法导论》还是《算法(第四版)》???

    在这里插入图片描述 在这里插入图片描述

    这两本书都是写算法的神书,两个没有必要都学。之前也纠结过一段时间,综合了网上的各种评价,《算法导论》数学证明比较多,偏学术;《算法》重点在于工程应用。对于编程者来说,直接用《算法》就可以了。对于我来说,由于我在读研究生,因此多了解一些算法中的数学思想是很有帮助的,因此我选算法导论。当然,你要是看到了这里,说明你也大概率学了算法导论。要是两个都学的请收下我的膝盖,或许我会在学完这本书之后有时间啃一啃另外一本,现在应该没什么机会。

  3. 我在学习算法导论前的知识基础:虽然刚开始学,但是我之前大致翻了一下,这本书里面的一些数学论证用到了高等数学的知识。此外对于栈、队列、图之类的数据结构基础讲的没那么细。因此,《算法导论》这本书,上来就让你啃,你肯定会觉得难,学着学着就慢慢就放弃了学习的信心。所以在学习算法导论之前,应该先看看一些预备知识的书。首先,大学的高数、线代、概率论要好好学学,不仅对这本书,对于别的方向也有很大作用。此外,我之前学习了《数据结构》(清华大学严蔚敏版本),和《算法图解》。《数据结构》是官方教材,是我在考研时学的。由于当时我本科并不是计算机专业,而要跨考计算机研究生,所以学起来很吃力。而《算法图解》就容易的多了。我由于有了数据结构的底子(其实也没多少,学得不好QAQ),以及当时正在学python,所以对于这本书我学起来还是很容易的(其实没有基础学起来也不费劲)。《算法图解》通俗易懂,把算法的一些概念方法用生活中通俗的例子以图画的形式来表达,更容易引起学习兴趣。对于代码方面也有一定底子,像C、Python等。当然这些都没看过,想要硬看这本书也不是不可能,有人也成功过。但是我觉得,磨刀不误砍柴工,有了知识储备,你能学习的更好,对于一些知识理解的也会更快更深刻。

  4. 我不是什么大牛,只是刚起步的新人。刚开始学习,难免有错误之处,恳请批评指正,大家一同进步,一同提高。

下面,正文开始。

在这一章当中,首先给出了一个排序方法——插入排序,用该方法来引入‘’循环不变式‘’这一思想,说明如何证明算法正确并作为例子分析运行时间。然后,引出算法中一个非常重要的方法——分治法,同时,利用分治法的思想,开发出归并排序,并进行分析。

一、插入排序

首先了解一下什么是插入排序:插入排序是一种排序方法,指在待排序的序列<a1,a2,…an>中,假设前面i-1(其中i>=2)个数已经是排好顺序的,现将第i个数插到前面已经排好的序列中,然后按照要求(升序或降序)找到合适自己的位置,使得插入第i个数的这个序列也是排好顺序的,按照此法对所有元素进行插入,直到整个序列排为有序的过程。最终输出为<a1’,a2’,…an’>,满足a1’≤a2’≤…≤an’(或a1’≥a2’≥…≥an’)。其中,希望被排序的数成为关键字。由于i>=2,所以一般关键字于第二位开始依次向后。

插入排序的工作方法如下图:
插入排序工作流程
严格来讲图中所谓的“空位置”其实并不空。按照代码,在插入之前以前的数字仍然存在,“插入”只是用关键字覆盖原来数字。但是为了便于理解,在此将移动后的位置看作为“空位置”。同时,对于第一步,你也可以把索引为0的单独一个数看成有序。
工作原理搞清楚了,接下来是代码。由于原书给的是伪代码,这里就不展示了。在此基础上我用Python3写了个代码。

array = [5,2,4,6,1,3]
length = len(array)                             #数列长度
#升序排列
for j in range(1,length):                       #从第二个到最后一个迭代
    key = array[j]                              #选为关键字
    i = j-1                                     #从关键字的前一个开始
    while i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值