时间复杂度
时间复杂度是判断一个算法的执行时间的性能指标,通常是一个代表算法输入值的字符串长度的函数,使用大O符号进行标数,不包括这个函数的低阶项和首项系数。
每一个算法都会存在一个实际的执行次数函数T(n),其中n代表的是每一个“操作单元”,并且认定每一个操作单元的所运行的时间都是相同的。如果将实际的执行次数函数T(n)中的低阶项、首项系数进行省略,就得到了我们所说的时间复杂度函数。省略...
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
算法要点
计数排序也是桶排序的一种,
计数排序适用于数据量很大,但值分布范围很小的场景下
第一步需要获取到序列中的最大值,最小值,创建一个长度为最大值-最小值的空的计数序列,其中序...
基数排序属于“分配式排序”,又称“桶子法”,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用
算法要点
基数排序属于桶排序的一种,所以桶排序的问题,在基数排序中依然存在
获取序列中最大元素的位数
依次根据序列中元素的个位数值,将元素放到0-9号十个桶中
将十个桶中的元素一次放回到序列中
继续根据每个元素的十位数值执行3步骤、4步骤,直到最大元素的位数...
是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
算法要点
通过递归的模式,将序列不断的从中间拆分,直到不可拆分为止,这一步骤称为“分”
通过递归的模式,将拆分后的两个序列通过对比两个序列的每...
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
算法要点
在一个序列中,随机先找出一个基准点(基准点取得好不好,影响到快排的性能,后面回对基准点如何找进行详细学习并记录)
将比基准点小的元素放在基准点的左侧,比基准点大的放在基准点的右侧
从左到右依次与基准点比较,找到大于基准点的一个节点,并...
希尔排序是是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本,通过把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
算法要点
将一个序列中的数据按一定的步长step划分为n组,对每个组中的数据进行插入排序(值得注意的是,每个组进行插入排序时,不需要遍历每一...
也称为直接插入排序、简单插入排序等。插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间
算法要点
将一个序列中的数据分成两个部分,从前到后依次为有序序列和无序序列
遍历拿...
首先在未排序序列中找到最小/大元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小/大元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
算法要点
假设第一个元素为最小/大的元素,然后于后续的元素依次比较,遇到比这个更小/大的元素则记录键与值,等到全部比较完成后,就拿到了未排序序列中的最大/小元素,然后与...
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)逆序就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
算法要点
依次比较相邻的两个元素,如果逆序,则交换。通过这种方式,在第一轮完成后,就可以确定最后一个元素的位置
上述工作重复进...
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
在代码中,我们通常使用递归函数来实现回溯算法,所以可以通过递归函数来了解回溯算法的机制。下面通过经典案例《八皇后问题》来学习了解这一算法。
八皇后问题
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一...