在编程中,我们都知道一个公式:算法 + 数据结构 = 程序。而算法我们认为是程序中的灵魂。我们用算法来处理数据,得到我们需要的数据。
设计原则
正确性:算法的正确性是指算法至少应该具有输入,输出和加工处理无歧义,能正确反映问题的需求,能够得到问题的正确答案。
算法正确大体分为四个层次:
1. 算法程序没有语法的错误。
2. 算法程序对于合法的输入数据能够产生满足要求的输出的结果。
3. 算法程序对于非法的输入数据能够得出满足规格说明的结果。
4. 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。
可读性:算法设计的另一个目的是为了便于阅读,理解和交流。
写代码的目的一是为了计算机执行,另一个为了便于他人阅读,让人理解和交流。
键壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
时间效率高和存储量低
算法具备以下五个特征:
有穷性(Finiteness)算法的有穷性是指算法必须能在执行有限个步骤之后终止;
确切性(Definiteness)算法的每一步骤必须有确切的定义;
输入项(Input)一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
输出项(Output)一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
可行性(Effectiveness)算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
常用的算法有:1、分治法;2、贪心算法,一种对某些求最优解问题的更简单、更迅速的设计技术;3、动态规划算法;4、回溯法,一种选优搜索法;5、分支限界法。
而我们最经常用的就是排序算法了。
排序算法
算法 | 最优复杂度 | 最差复杂度 | 平均复杂度 | 稳定性 |
---|---|---|---|---|
选择排序 | O(n²) | O(n²) | O(n²) | 不稳定 |
冒泡排序 | O(n) | O(n²) | O(n²) | 稳定 |
插入排序 | O(n) | O(n²) | O(n²) | 稳定 |
希尔排序 | O(n) | O(n²) | O(n1.3) | 不稳定 |
归并排序 | O(nlog n) | O(nlog n) | O(nlog n) | 稳定 |
快速排序 | O(nlog n) | O(n²) | O(nlog n) | 不稳定 |
堆排序 | O(nlog n) | O(nlog n) | O(nlog n) | 不稳定 |
基数排序 | O(d(r+n)) | O(d(n+rd)) | O(d(r+n)) | 稳定 |
我觉得其他都很好理解,那怎么理解稳定性呢?
通俗地讲就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。即:如,如果A i == A j,Ai 原来在 Aj 位置前,排序后 Ai 仍然是在 Aj 位置前
如果不稳定,他们的位置可能会发生改变。