每天一个小算法(insertion sort3)

今天多看看插入排序的理论部分。

先贴几个概念吧:

1、伪代码英语pseudocode),又称为虚拟代码,是高层次描述算法的一种方法。它不是一种现实存在的编程语言(已经出现了类似伪代码的语言,参见Nuva);它可能综合使用多种编程语言的语法、保留字,甚至会用到自然语言。它以编程语言的书写形式指明算法的职能。相比于程序语言(例如Java、C++、C、Delphi 等等)它更类似自然语言。它是半形式化、不标准的语言。我们可以将整个算法运行过程的结构用接近自然语言的形式(这里可以使用任何一种作者熟悉的文字,例如中文、英文,重点是将程序的意思表达出来)描述出来。使用伪代码,可以帮助我们更好的表述算法,不用拘泥于具体的实现。(源自:http://zh.wikipedia.org/wiki/%E4%BC%AA%E4%BB%A3%E7%A0%81)

自己理解:伪代码种类繁杂,没有固定的书写格式,不过要写清楚让人看懂就可以了。

INSERT-SORT(A)
    for j <-- 2 to length[A]
        do key <-- A[j]
           > Insert A[j] into the sorted sequence A[1..j-1].
           i <-- j - 1
        while i > 0 and A[i] > key
            do A[i+1] <-- A[i]
               i <-- i - 1
        A[i+1] <-- key


以上是copy别人的伪代码。具体来说,就是 if 条件 do 事情;for while 循环;<—为赋值语句。以后写程序之前先要写伪代码。


2、时间和空间复杂度

算法时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。

一个程序空间复杂度是指运行完一个程序所需内存的大小。利用程序空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。
S(n)=O(f(n))
其中n为问题的规模,S(n)表示空间复杂度
据说现在空间复杂度不用过多考虑,毕竟内存都比较大了。时间复杂度还是要好好琢磨的。




原文地址:https://www.cnblogs.com/batteryhp/p/5020514.html