算法及数据结构
算法
定义
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
特性
有限性(Finiteness):一个算法必须保证执行有限步之后结束。
确切性(Definiteness): 一个算法的每一步骤必须有确切的定义。
输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
要素 : 数据对象的运算和操作;
计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,成为该计算机系统的指令系统
分类 :
①算术运算:加减乘除等运算
②逻辑运算:或、且、非等运算
③关系运算:大于、小于、等于、不等于等运算
④数据传输:输入、输出、赋值等运算
算法的控制结构
一个算法的功能结构不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关
算法优劣评定
时间复杂度(执行时间)
https://baike.baidu.com/item/时间复杂度/1894057?fr=aladdin
空间复杂度(所需要占用的存储空间)
https://baike.baidu.com/item/空间复杂度/9664257?fr=aladdin
具体算法参考
https://www.cnblogs.com/zakers/archive/2015/09/14/4808821.html
排序算法
排序算法参考网址http://www.yduba.com/biancheng-5692581293.html
冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
时间复杂度
- 最差时间复杂度:O(N^2)
- 最优时间复杂度:O(N)
- 平均时间复杂度:O(N^2)
空间复杂度
- O(1)
代码演示
-
选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
-
时间复杂度
O(N^2) -
空间复杂度
O(1)
代码演示:
-
快速排序
-
快速排序是由东尼·霍尔所发展的一种排序算法。其基本思想是,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
-
时间复杂度
-最差时间复杂度:O(N^2)
最优时间复杂度:O(NlogN)
平均时间复杂度:O(NlogN) -
空间复杂度
与具体的实现策略有关
代码演示:
-
插入排序
插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 -
时间复杂度
O(n^2) -
空间复杂度
O(1) -
插入排序是稳定排序,不适合对大量数据排序,适合对接近排序的数据排序
代码演示 :
基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
- 时间复杂度
O(NlogN)
代码演示
-
堆排序
堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即__A[PARENT[i]] >= A[i]__。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。时间复杂度
最差时间复杂度:O(NlogN)
最优时间复杂度:O(NlogN)
平均时间复杂度:O(NlogN)
空间复杂度
最差空间复杂度:O(n)
最优空间复杂度:O(1)
缺点
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
我们知道堆的结构是节点i的孩子为2i和2i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。在一个长为n 的序列,堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n /2-1, n/2-2, …1这些个父节点选择元素时,就会破坏稳定性。有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没 有交换,那么这2个相同的元素之间的稳定性就被破坏了。所以,堆排序不是稳定的排序算法。
代码演示