计算机二级C语言知识点
第一章 数据与算法
1.1 算法
-
各种排序方法中最坏情况下需要比较的次数分别为:冒泡排序n(n-1)/2、快速排序n(n-1)/2、简单插入排序n(n-1)/2、简单选择排序n(n-1)/2、希尔排序O(n1.5)、堆排序O(nlog2n)。
-
算法复杂度,即算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。一个算法的评价主要从时间复杂度和空间复杂度来考虑。算法的时间复杂度是指执行算法所需要的计算工作量。空间复杂度是指算法在计算机内执行时所需存储空间的度量。
-
对于长度为n的有序线性表,在最坏情况下,二分法查找只需比较log2n次,而顺序查找需要比较n次。
-
所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列中,用队尾指针rear指向队列中的队尾元素,用队头指针front指向队头元素的前一个位置。循环队列的主要操作是:入队运算和退队运算。每进行一次入队运算,队尾指针就进一。每进行一次退队运算,队头指针就进一。当rear或front等于队列的长度加1时,就把rear或front值置为1。所以在循环队列中,队头指针可以大于队尾指针,也可以小于队尾指针。
-
算法的空间复杂度是指执行这个算法所需要的内存空间。这个内存空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。
-
冒泡排序、简单选择排序和直接插入排序法在最坏的情况下比较次数为:n(n-1)/2。而堆排序法在最坏的情况下需要比较的次数为O(nlog2n)。其中堆排序的比较次数最少。
-
栈是一种限定在一端进行插入与删除的线性表。在主函数调用子函数时,要首先保存主函数当前的状态,然后转去执行子函数,把子函数的运行结果返回到主函数调用子函数时的位置,主函数再接着往下执行,这种过程符合栈的特点。所以一般采用栈式存储方式。
-
算法的有穷性,是指算法必须能在有限的时间内做完,即算法必须能在执行有限个步骤之后终止。
-
算法的时间复杂度,是指执行算法所需要的计算工作量。算法的工作量可以用算法在执行过程中所需基本运算的执行次数来度量
1.2 数据结构的基本概念
- 影响程序执行效率的因素有很多,如数据的存储结构、程序处理的数据量、程序的算法等。顺序存储结构和链式存储结构在数据插入和删除操作上的效率就存在差别。其中,链式存储结构的效率要高一些。
1.3 线性表及其顺序存储结构
- 根据数据结构中各数据元素之间的前后件关系的复杂程度,一般将数据结构分这两大类型:线性结构与非线性结构。如果一个非空的数据结构满足两个条件:①有且只有一个根结点;②每一个结点最多有一个前件,也最多有一个后件。称该数据结构为线性结构,又称为线性表。对于这个题目来说,有且只有一个根结点的数据结构可能是线性结构,也可能是非线性结构。具有一个根结点的树就是一个非线性结构。
- 栈是允许在栈顶进行插入和删除的线性表,不允许在栈底进行插入与删除。通常用指针top来指示栈顶的位置,用指针bottom指向栈底。对栈的操作有入栈和退栈两种。入栈运算:首先将栈顶指针进一(即top加1),然后将新元素插入到栈顶指针指向的位置。退栈运算:首先将栈顶元素(栈顶指针指向的元素)赋给一个指定的变量,然后将栈顶指针退一(即top减1)。因为初始状态为top=0,经过入栈和退栈操作后栈中的元素个数就是top指针指向的位置。
- 排序方法 最坏时间复杂度 最好时间复杂度 平均时间复杂度
直接插入 O(n2) O(n) O(n2)
简单选择 O(n2) O(n2) O(n2)
冒泡排序 O(n2) O(n) O(n2)
快速排序 O(n2) O(nlog2n) O(nlog2n)
堆排序 O(nlog2n) O(nlog2n) O(nlog2n)
归并排序 O(nlog2n) O(nlog2n) O(nlog2n) - 有序表的对分查找条件是有序表为顺序存储。
- 顺序查找:①如果线性表为无序表(即表中元素的排序是无序的),则无论是顺序存储结构还是链式存储结构,都只能用顺序查找;②即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。分块查找(又称索引顺序查找):分块有序表结构分为两部分,①线性表本身采用顺序存储结构;②在建立一个索引表,在索引表中,对线性表的每个子表建立一个索引结点,每个结点包括两个域:一是数据域,用于存放对应子表中的最大元素值;二是指针域,用于指示对应子表的第一个元素在整个线性表中的序号。显然索引表关于数据域是有序的。
- 计算机中数据按照其数据逻辑结构,可以分为线性结构和非线性结构。而数据在内存或磁盘中的存储,可以分为顺序存储和链式存储。数据的逻辑结构与存储结构之间没有对应的关系。
1.4 栈和队列
-
在循环队列中元素的个数为“(rear-front+M)%M”,式中rear为队尾指针,front为队首指针,M为存储容量,%为取余符号。
-
A)(91,85,53,36,47,30,24,12)
B)(91,85,53,47,36,30,24,12)
C)(47,91,53,85,30,12,24,36)
D)(91,85,53,47,30,12,24,36)堆可以看成一棵完全二叉树:任一根节点>=左右孩子(或者<=),(大的叫大根堆,小的叫小根堆)。注意一个堆中的这种性质有一致性,不能既有大于又有小于情况存在。此题可以这么做,把结点按照完全二叉树画出来就一目了然了。这个题目很明显91是最大的根,而选项C是“左根右”的排序,那么91的左边只有47,其他都在右边,而右边无法按照此顺序排列,所以选项C不是堆。3. 带链栈的栈底指针是随栈的操作而动态变化的
1.5 线性链表
-
算法的时间复杂度,是指执行算法所需要的计算工作量,算法的工作量用算法所执行的基本运行次数来度量,所以与运行算法时特定的输入有关,
-
在一个长度为n的线性表中顺序查找值为x的元素时,在等概率情况下查找成功时平均查找长度为(n+1)/2