算法
(一)数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。
(二)数据结构是为算法服务的,算法是要作用在特定的数据结构上的。
(三)数据结构分为: “线性结构” (一组连续的内存空间来存储一组数据) 和 “非线性结构”
线性结构:
数组
队列: 先进先出
栈: 先进后出
链表
非线性结构
树
图
堆
(四)复杂度
时间复杂度(如何让代码运行得更快)
空间复杂度(如何让代码更省存储空间)
时间复杂度好坏受“运行环境”和“数据规模”的影响
(五)大 O 复杂度表示法
"肉眼"得到一段代码的执行时间
(六)几种常见时间复杂度实例分析
O(1)< O(logn)< O(n)< O(n^2)
排序
问:如何判断排序是稳定还是不稳定?
待排的关键字中,若存在相同的关键字,相同关键字不交换,则是稳定的。
1、冒泡排序
(一)原理
冒泡排序算法的原理如下:
①比较相邻的元素。如果第一个比第二个大,就交换他们两个。
②对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点, 最后的元素应该会是最大的数。
③针对所有的元素重复以上的步骤,除了最后一个。
④持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
(二)冒泡排序是原地排序算法吗?
冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以它的空间复杂度为 O(1),是一个原地排序算法。
(三)冒泡排序是稳定的排序算法吗?
在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以冒泡排序是稳定的排序算法。
(四)冒泡排序的时间复杂度是多少?
O(n²)
最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束了
最好情况时间复杂度是 O(n)
最坏的情况是,要排序的数据刚好是倒序排列的,我们需要进行 n 次冒泡操作,所以最坏情况时间复杂度为 O(n²)
2、插入排序
(一)原理
首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元
素,就是数组的第一个元素。
插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并 保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束
(二)插入排序是原地排序算法吗?
从实现过程可以很明显地看出,插入排序算法的运行并不需要额外的存储空间,所以空间复杂度是O(1),也就是说,这是一个原地排序算法。
(三)插入排序是稳定的排序算法吗
在插入排序中,对于值相同的元素,我们可以选择将后面出现的元素,插入到前面出现元素的后面,这样 就可以保持原有的前后顺序不变,所以插入排序是稳定的排序算法。
(四)插入排序的时间复杂度是多少?
O(n²)