考研复试-数据结构(1)
1. 数组和链表的区别
从逻辑结构上看:
数组是事先定义固定的长度,定义后不能改变。当数据增加时,可能超过数组能存放的元素个数。当数据减少时,会造成内存浪费。查找某一位置的元素非常方便。
链表长度是可变的,根据需要可增加或缩短链表的长度,并且能方便的进行插入,删除数据项。查找某一位置的元素只能顺序查找。
从内存存储上看
静态数组从栈中分配空间,在内存中是连续存放的,对程序员来说方便快捷,但分配的自由度小。
链表从堆中分配空间,在内存中是通过元素中的指针联系到一起的,自由度大但是申请管理比较麻烦。
数组优缺点
随机访问性强,查找速度快
插入和删除效率低,可能浪费内存,必须有足够的连续内存空间,大小固定,不能动态扩展
链表优缺点
链表插入和删除速度快,内存利用率高,不会浪费内存,大小没有固定,扩展灵活。
链表不能随机查找,查找元素必须从第一个开始遍历,查找效率低。
2. 排序算法有几种,分别说出算法思想和特点
插入排序
左边的视为有序的序列,逐次将右边的数据插入左边序列。
希尔排序
原理和插入排序差不多,只不过一开始增量较大,每趟之后逐渐减小增量。使得序列变得基本有序后再进行直接插入排序,能较好提高性能。
冒泡排序
比较相邻的元素,每次都定位一个元素。设置一个flag,若一趟比较未发生交换,则数组有序,此时排序结束。
快速排序
- 选择一个基准元素,通常选择第一个元素或者最后一个元素。
- 通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小,另一部分记录的元素值比基准元素值大。
- 此时基准元素在其排好序后的正确位置。
- 然后分别对这两部分记录用相同的方法继续进行排序,直到整个序列有序。
快速排序的改进:只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。K=8时性能最佳。
选择排序
每次遍历整个序列,选择最小的元素放入已排序的序列中
堆排序
堆是一棵完全二叉树。每次将堆顶输出,用堆的最后一个元素填补堆顶,并重新调整整个堆。递归定义,一般都用数组来存储堆
归并排序
分治法,每次都将已经有序的子序列合并,得到完全有序的序列。
基数排序
多关键字排序
选择排序算法准则
一般而言,需要考虑的因素有以下四点:
设待排序元素的个数为n:
- 当n较大时,应采用事件复杂度为O(nlog2n)的排序方法:快速排序,堆排序,归并排序
- 当n较小时,内存空间允许,且要求稳定性:归并排序
- 当n较小时,可采用直接插入或直接选择排序。
- 直接插入排序:要求稳定性
- 直接选择排序:不要求稳定性
- 一般不使用或不直接使用传统的冒泡排序
- 基数排序:稳定但有局限性
- 关键字可分解
- 记录的关键字位数较少,
- 如果是数字时,最好是无符号的
各类算法比较


浙公网安备 33010602011771号