考研复试-数据结构(1)

1. 数组和链表的区别

从逻辑结构上看:

数组是事先定义固定的长度,定义后不能改变。当数据增加时,可能超过数组能存放的元素个数。当数据减少时,会造成内存浪费。查找某一位置的元素非常方便。

链表长度是可变的,根据需要可增加或缩短链表的长度,并且能方便的进行插入,删除数据项。查找某一位置的元素只能顺序查找。

从内存存储上看

静态数组从栈中分配空间,在内存中是连续存放的,对程序员来说方便快捷,但分配的自由度小。

链表从堆中分配空间,在内存中是通过元素中的指针联系到一起的,自由度大但是申请管理比较麻烦。

数组优缺点

随机访问性强,查找速度快

插入和删除效率低,可能浪费内存,必须有足够的连续内存空间,大小固定,不能动态扩展

链表优缺点

链表插入和删除速度快,内存利用率高,不会浪费内存,大小没有固定,扩展灵活。

链表不能随机查找,查找元素必须从第一个开始遍历,查找效率低。

2. 排序算法有几种,分别说出算法思想和特点

插入排序

左边的视为有序的序列,逐次将右边的数据插入左边序列。

希尔排序

原理和插入排序差不多,只不过一开始增量较大,每趟之后逐渐减小增量。使得序列变得基本有序后再进行直接插入排序,能较好提高性能。

冒泡排序

比较相邻的元素,每次都定位一个元素。设置一个flag,若一趟比较未发生交换,则数组有序,此时排序结束。

快速排序

  1. 选择一个基准元素,通常选择第一个元素或者最后一个元素。
  2. 通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小,另一部分记录的元素值比基准元素值大。
  3. 此时基准元素在其排好序后的正确位置。
  4. 然后分别对这两部分记录用相同的方法继续进行排序,直到整个序列有序。

快速排序的改进:只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。K=8时性能最佳。

选择排序

每次遍历整个序列,选择最小的元素放入已排序的序列中

堆排序

堆是一棵完全二叉树。每次将堆顶输出,用堆的最后一个元素填补堆顶,并重新调整整个堆。递归定义,一般都用数组来存储堆

归并排序

分治法,每次都将已经有序的子序列合并,得到完全有序的序列。

基数排序

多关键字排序

选择排序算法准则

一般而言,需要考虑的因素有以下四点:
设待排序元素的个数为n:

  1. 当n较大时,应采用事件复杂度为O(nlog2n)的排序方法:快速排序,堆排序,归并排序
  2. 当n较小时,内存空间允许,且要求稳定性:归并排序
  3. 当n较小时,可采用直接插入或直接选择排序。
    1. 直接插入排序:要求稳定性
    2. 直接选择排序:不要求稳定性
  4. 一般不使用或不直接使用传统的冒泡排序
  5. 基数排序:稳定但有局限性
    1. 关键字可分解
    2. 记录的关键字位数较少,
    3. 如果是数字时,最好是无符号的

各类算法比较

posted @ 2021-03-06 11:17  平平无奇的打工人  阅读(159)  评论(0)    收藏  举报