1.这种专门研究应用程序中数据之间逻辑关系、存储方式及其操作的学问就是数据结构。
2.基本逻辑结构:集合 线性关系 树形关系 图形关系
3.物理存储结构:顺序存储结构、非顺序存储结构
4.算法的设计取决于逻辑结构,算法的实现依赖于存储结构
5.线性表:用于存储相似结构的数据
分为顺序存储结构和链式存储结构;可以进行插入删除和排序的操作;
6.栈:只能在一端进行插入删除的操作;
允许进行插入、删除操作的一端为栈顶top,另一端为栈底bottom;进栈出栈;先进后出;顺序栈和链式栈
7.队列:使用一端来插入数据一端来删除数据
先进先出;顺序队列和链式队列;
8.衡量排序算法的优劣:时间复杂度、空间复杂度、稳定性
9.排序算法分类:内部排序和外部排序
直接选择排序、堆排序、冒泡排序、快速排序、直接插入排序、折半插入排序、shell排序、归并排序、桶式排序、基数排序
直接选择排序:
算法时间效率为O(n2),空间效率为O(1),算法不稳定
堆排序
算法的时间效率,空间效率O(1),算法不稳定
冒泡排序
相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。
算法的时间效率:从冒泡排序的算法可以看出,若待排序的元素为正序,则只需进行一趟排序,比较次数为n-1次,移动元素次数为0;若待排序的元素为逆序,则需要进行n-1趟排序,比较次数为,移动次数为,因此时间复杂度为
算法的空间效率O(1)
算法不稳定
快速排序
任取待排序序列中的某个元素作为标准,通过一次划分,将待排序元素分为左右子序列,然后对两个子序列继续进行划分,直至每一个序列只有一个元素为止。最后得到的序列便是有序序列
算法的时间效率:时间效率很好,因为每趟能确定的元素都呈指数增长,故时间复杂度为
算法的空间效率:由于使用递归,而递归使用栈,因此空间效率最优时为
算法的稳定性:由于包含跳跃式交换,因此不稳定
直接插入排序:从无序表中选择一个最小的元素插入形成有序表
算法时间效率O(n2)
空间效率O(1)
算法稳定
折半插入排序:是对直接插入排序的简单改进,通过不断地折半来快速确定元素插入位置
Java的Arrays类里的binarySearch()方法,就是折半查找的实现,用于从指定数组中查找指定元素,前提是该数组已经处于有序状态。
希尔排序
将所有元素按照某个增量分为若干子序列,子序列采用直接插入排序之后,减小增量,再次对子序列进行执行插入排序,直到整个序列有序
算法的时间效率:开销估计在之间
算法的空间效率:空间效率很高,只需要一个附加程序单元用于交换,其空间效率为 O(1)
算法的稳定性:不稳定
归并排序
将已经排序好的顺序表合并成一个已排序表,顺序比较两者相应元素,小者移入另一个表中,直至其中任一表都移入另一表为止
算法的时间效率:归并算法需要递归地进行分解、合并,每进行一趟归并排序,需要merge()方法一次,每次执行merge()需要比较n次,故复杂度为
算法的空间效率:较差,需要一个与原始序列同样大小的辅助序列
算法的稳定性:稳定
基数排序
基数排序的总体思路就是将待排数据拆分成多个关键字进行排序,也就是说,基数排序的实质是多关键字排序。
各种内部排序方法性能比较
1.从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法,都包含在上图的“简单排序”中。对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。
3.从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排序、快速排序、 Shell排序和堆排序是不稳定排序
4.从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。
排序方法的选择
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。