⒈时间复杂度
概念:时间复杂度为一个算法流程中(最差数据的情况下)常规操作数量的指标。常用O来表示,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为f(n),那么时间复杂度为O(f(n))。
1.1简单的几种排序算法
1.1.1冒泡排序
原理:一共有N个数,比较两个相邻的数,将大的数放在最右面,最后这个数就是最大的,之后N-1,依此类推。
过程大概是这样的。如果按照最坏的结果来看,N个数字要完成排序,总共进行N-1趟排序,每趟的排序次数为(N-i)次,
所以时间复杂度是O(n^2)。
1.1.2 选择排序
原理:先从数组中遍历找到最小或最大的元素和最左边或最右边的数交换,然后再在剩下的元素中找最小或最大的元素和最左边+1或最右边-1下标的数交换。
依次类推,和冒泡排序基本相同,时间复杂度为O(n^2)
1.1.3 插入排序
原理:先拿出数组中的第一个数,然后将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中,如此反复。
最坏的情况下和选择,冒泡排序一样时间复杂度为O(n^2),但是如果给的数组是一开始就排好的就不用进行n-1的比较的过程,时间复杂度为O(n)。
1.1.4 递归行为之master公式
1.1.5 归并排序(最为经典的是解决算法中小和问题和逆序对问题)
如果是数组是基数就是在分的时候做出变化,比如说是5个数就是左边2右边3,或者左边3右边2,这样。
在根据mater公式归并排序的a=2,b=2,d=1(数组左右平分函数个数为N/2,所以b=2,执行了两次,左右各一次,a=2,merge执行了N次,时间复杂度为O(N),所以d=1),最后时间复杂度为O(N * logN) 。
1.1.6 快速排序
快速排序时间复杂度O(nlogn)
1.1.7 堆排序
首先堆可以被看成一个数组,也可以被看成一个完全二叉树。
按照堆的特点可以把堆分为大顶堆和小顶堆
大顶堆:每个结点的值都大于或等于其左右孩子结点的值
小顶堆:每个结点的值都小于或等于其左右孩子结点的值
如果一个堆看成数组
该孩子结点对应父结点计算方法 (i-1)/2(i是该结点对应的数组下标)
父结点对应孩子结点计算方法 左孩子i*2+1,右孩子i*2+2。