写在前面
算法,对于iOS开发者来说,既熟悉又陌生。首先,在iOS开发过程中,对算法要求不高,用到算法时候也是少之甚少,除非是一些接近底层开发需要用到一些算法。但是,算法作为基础,又是开发者的必备技能,尤其是求职面试中一项重要考察指标。
遂,笔者在此整理一下常用的算法,以供后用。
算法中的概念
排序算法稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。(算法的稳定性与不稳定性是可以相互转化的)脑补一下
时间复杂度、空间复杂度,自行搜索,不再赘述。
需要讲解的算法
冒泡排序算法
选择排序算法
快速排序算法
归并排序算法
翻转二叉树(递归实现)
冒泡排序算法
算法实现思想:
1、比较相邻的元素,若第一个比第二个大,就交换这两个元素的位置;
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,但除了最后一个元素;
3、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
时间复杂度:min = O(n),max =O(n^2);
算法稳定性:稳定,判断标准:相同值的两个元素不会更换位置;(将冒泡排序算法的稳定性转化为不稳定性的方式:array[j] < array[j+1]改为array[j] <= array[j+1])
算法实现:(降序排序)
C语言实现:
|
|
swift语言实现:
|
|
Objective-C语言实现:
|
|
选择排序算法
算法实现思想:
1、n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
2、初始状态:无序区为R[1..n],有序区为空;
3、第1趟排序: 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
4、第i趟排序:第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
时间复杂度:min = O(n),max =O(n^2);
算法稳定性:不稳定;(不稳定的原因举例:5 5 3 变为 3 5 5,第一趟排序,第一个5
会和3
的位置互换,从而破坏该算法的稳定性)
算法实现:(升序排序)
C语言实现:
|
|
swift语言实现:
|
|
OC语言实现:
|
|
快速排序算法
算法实现思想:
1、设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2、以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3、从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5、重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
时间复杂度:max = O(n^2) 、 average = O(n*log2n);
算法稳定性:不稳定;
算法实现 (升序排序)
C语言实现:
|
|
Swift语言实现:
|
|
Objective-C语言实现:
|
|
归并排序算法
算法实现思想:
1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
2、设定两个指针,最初位置分别为两个已经排序序列的起始位置;
3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
4、 重复步骤3直到某一指针超出序列尾;
5、将另一序列剩下的所有元素直接复制到合并序列尾。
举例说明:假设存在数列:{4,189,80,290,35,8,2}
1、初始状态:4,189,80,290,35,8,2
2、第一次归并后:{4,189},{80,290},{35,8},{2} 比较次数:3
3、第二次归并后:{4,80,189,290},{2,8,35} 比较次数:4
4、第三次归并后:{2,4,8,35,80,189,290} 比较次数:4
5、总比较次数:3+4+4 = 11
时间复杂度: O(n log n);
算法稳定性 : 稳定;
算法实现:
C语言实现:
|
|
Objective-C语言实现:
|
|
Swift语言实现:
|
|
翻转二叉树(递归实现)
算法实现(递归):
.h文件
|
|
.m文件
|
|
写到最后
以上内容,就是我对常用算法的简单总结。大家如有其他意见欢迎评论。