数据结构小结


  1.                                    数据结构基础

    1.数据结构的三个方面:     

    数据的逻辑结构:反应数据元素之间的逻辑关系. (线性,树形,图状,集合)

    数据的存储结构:数据的逻辑结构在计算机中的表示. (顺序存储,链式存储)

    数据的运算结构:算法(查找,排序,插入,删除,更新,读取)

    2.逻辑结构

    线性表:数量有限的元素排序,除首结点没有前趋结点,尾结点没有后继结点,其他所有结点均有有且仅有一个前趋结点和后继结点

    常用数据结构有3:即堆栈,队列,.  堆栈:头添加头删除;队列:尾添加头删除;串:  任何结点操作

    :树有且仅有一个结点没有父亲结点(称为根结点),其他结点有且仅有一个前趋结点,且每个结点的后继结点数目不限.    

    典型一对多关系,没有形成封闭环路,属于层次型结构

    :每个结点都能有任意个数的前趋和后继结点.典型多对多的关系,可以形成封闭的环路,

    3.算法:在有限的时间范围内解决特定问题的方法描述.算法的复杂度:

    空间复杂度: (空间利用率)解决某具体问题的程序完全运行时,其代码段静态和动态数据段占用内,外存储空间的大小.当问题规模基于某以单位从1增至n,解决该问题算法所占用的空间也以某以单位从1增至f(n),则称该算法的空间复杂度为f(n)

    时间复杂度: (时间效率)解决某一具体问题多花时间的大小,当问题规模基于某一单位从1增至n,解决该问题算法所花费的时间也以某以单位从1增至T(n),则该算法的时间复杂度为T(n).

    常见的复杂度表示方法:

    O(1):基本操作语句中没有循环语句

    O(log n):对数时间

    O(n):基本操作语句中存在单重循环,称线性时间

    O(n log n):称线性对数时间

    例子:for(i=1;i<=n;i++);执行了:n

    For(i=1;i*i<=n;i++);试行了:二次根号n

    For(i=1;i<=n;i++)  For (j=1;j<=i;j++)x++;执行了:n的平方次

While(i<=n) i*=10;执行了:l g n

============================================================================================================================================


  1. 整数的分划问题: 对于一个整数n的分划,就是把n表示成一系列正整数之和的表达式. 注意分划与顺序无关,另外n本身也是一种划分.P60

  2. 游戏问题:12个朋友手拉手站成一个圆圈,从一个小朋友开始报数,报到7的那个小朋友退到圈外,然后他的下一位重新报’1’. 求解剩下的最后一个所站位置.P77

  3. 开灯问题:有从1n依次编号的n个同学和n盏灯。1号同学将所有的灯都关掉;2号同学将编号为2的倍数的灯全都打开;3号同学则将编号为3的倍数的灯做相反处理;以后的同学都将自己编号的倍数的灯做相反处理。问经n个同学操作后,哪些灯是打开的? P92

  4. 10箱产品,每箱有1000,正品每件100.其中有几箱是次品,每件次品比正品轻10, 问能否用称只称一次,找出哪几箱是次品.P102

  5. 楼梯上有n阶台阶,上楼时可以一步上1,也可以一次上两阶, 编写算法计算共有多少种不同的上楼梯方法.

  6. 一辆吉普车穿越1000千米的沙漠.吉普车的总装油量为500加仑,耗油率为1加仑/千米, 由于少中没有油库, 必须先用这辆车在沙漠中建立临时油库. 若吉普车用最少的耗油量穿越沙漠, 应在哪些地方建立油库, 以及各处存储的油量.

     

    ============================================================================================================================================

    ============================================================================================================================================



                                                                                 查找与排序

  1. 1.查找

  2. 线性表的顺序查找:将查找值顺序逐个与结点值进行比较,相等即为查找成功,否则查找失败.

    顺序表的二分查找:首先将结点按关键字(数组下标)排序,其次将查找值与中间位置的值比较,相等,查找成功;不等,则中间数据大于或小于查找值,无论怎样查找将在一半的数据中查找。

    线性表的Hash散列查找利用散列函数H(key)=key%m构造Hash散列表

    Hash冲突的解决方法:1.开放地址法(偏移量)2.拉链法(链表头指针->创建结点)

    二叉排序树(二叉搜索树)的查找:

    例题:

    1.二叉排序树的搜索查找。

    2..线性表的关键字集合为{113,12,180,138,92,67,94},共有7个元素,已知散列函数为H(k)=k%7,散列表长度m=10,起始地址为0,分别用线性探测和链接法来解决冲突,试画出对应的散列表。

    3.字典树:Trie,又称单词查找树键树,是一种形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

    它有3个基本性质:

    根节点不包含字符,除根节点外每一个节点都只包含一个字符

    根节点到某一节点路径上经过的字符连接起来,为该节点对应的符串

    每个节点的所有子节点包含的字符都不相同。

    struct_Trie_Tree

    {

    struct_Trie_Tree *arr[26];

    boolflag;    -- 统计

    char*str;

    }

    ============================================================================================================================================

    2.排序

    稳定排序:通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = AjAi原来在位置前,排序后Ai还是要在Aj位置前。

    //冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法,      

    //选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法.

     

    //冒泡排序:复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(n)

    //插入排序:O(n*n)

    //归并排序:log2(n)*n

    //选择排序:O(n*n)

    //快速排序:平均时间复杂度log2(n)*n,内部排序方法中大多数情况下是最好的。

    //堆排序:log2(n)*n

    //希尔排序:算法的复杂度为n1.2次幂

     

    //(1)冒泡排序:按顺序,相邻元素两两比较;每次两个元素比较中(如果需要),将小的元素前调,大的元素后调。循环得到每次序列中元素的最大值。

    //(2)选择排序:遍历寻找最小元素的序列号,然后将该元素与第一个位置的元素交换位置;循环得到每次序列中元素的最小值。

    //(3)插入排序:在一个的有序序列中,每次插入一个元素。起始有序序列只有一个元素,插入元素的比较从有序序列的尾开始。

    /(4)快速排序:if(i<j) =>先排序(分成数的左小右大,注意中间数不需要分组),后分组(分组,递归)

    取中枢元素的temp=a[index],一般使用a[0]

    While(1)

    {

    判断i>=j,a[i]=temp,返回i;否则右边的下标j往左,当a[j]<=a[index]时,a[i]=a[j],即调整过去一个数

    然后判断i>=j,a[i]=temp,返回i;否则左边的下标i往右,当a[i]>=a[index]a[j]=a[i],即调整过去一个数

    }

    //(5)归并排序:if(low<high) =>         把序列分成短序列,递归出口是短序列只有一个元素或者两个元素(一次比较和交换);然后把各个短序列按照原分组合并成一个有序的长序列。

          创建保存递归排序的数组,以及下标变量index

          创建两个分组的头尾下标,此时两个分组应该是两个有序数组。

          将两个分组排序后数放入新数组;再放回原数组

    //(7)希尔排序(shell):希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)

    //(8)堆排序:堆的结构是节点i的孩子为2*i2*i+1节点,大顶堆要求父节点大于等于其2个子节点,且要求是完全二叉树

        1)首先根据该数组元素构建一个完全二叉树,然后需要构造初始堆,则从最后一个非叶节点开始调整,直到根结点。即将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆。

       2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 

       3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

    ============================================================================================================================================

    ============================================================================================================================================

     

     

                   树与二叉树

    :有限的节点(NODE)和分支(Branch)构成的非线性数据结构。

    特点:

    1.有且只有一个根结点,每个节点有且只有一个前趋,0个或多个后继。

          2.既有层次关系又有分支关系。

          3.树上没有回路

    树的基本概念:

          1.根节点(root):没有父亲结点的那个结点称为根节点。(A)

          2.兄弟节点:具有相同父亲节点的那些节点互称为兄弟节点

          3.叶子结点(leaf):没有子结点的那些节点称为叶子结点。

    4.中间节点:即同时拥有父亲结点和子结点称为中间结点。如(BFD

    5.度:结点的度是某结点拥有子结点的个数。树的度是树中结点的最大结点的度。

    6.层次:结点层次是树中结点所处代数,一代一层。

    7.同代:同代由处于同一层次的结点构成。

    8.结点的高度:结点的高度是指该节点到其直系叶结点的最大层次

    9.边:边是某一结点到其子结点的直线

    10.路径和分支:路径是由连续边构成的集合,而终点是叶子结点的路径,称为分支。

    树的分类

    (1).有序树:树中各结点的子结点需按一定次序从左至右摆放,不能互换

    (2).无序树:树中各结点的子结点可随意从左至右摆放,允许互换

    弊端:为了提高空间利用率和降低算法设计的难度,通常不处理一般的树和森林,而只对二叉树操作,一般的树和森林可以通过转换成二叉树进行处理。

          左孩子右兄弟:所有兄弟结点之间加线;仅保留树中每个结点与第一个孩子的连线,删除其与其他孩子的连线;以根节点为轴心调整层次。

    ============================================================================================================================================

    二叉树是树中结点个数不大于2,且兄弟结点间次序不能互换的有序树。

    二叉树的分类:

          1.满二叉树:深度为K的二叉树有2K(K次方)-1个结点

    2.完全二叉树:完全二叉树只允许最后一层出现空结点,且空结点要从右至左顺序排列,中间没有间隔,尔其余各层均有最大结点数。

          3.二叉排序树:树中每个结点值均不小于该结点的左子树所有结点值,且不大于右子树的所有结点值。(每个结点小到大:左中右;没有键值相等的结点O(logn)

    4.平衡二叉树(AVL)任意结点的左右子树高度只能相差一的二叉树。其查找、插入和删除的平均和最坏情况下都是O(logn)(树的旋转,网页)

    5.扩充二叉树和Hufferman

    扩充二叉树的每个结点只能有0个或2个子结点,其中有2个子结点的是内部结点,0个子结点的是外部结点。

    给每个外部结点以加权系数,则整个树外部结点加权和P=W1L1+W2L2+…+WnLn最小的扩充二叉树称为Hufferman

          6.红黑树是一种平衡二叉查找树。根结点是黑的;每个叶子节点即空节点是黑的;红结点的两个儿子是黑的;对每个结点,从该结点到其子孙结点的所有路径上包含相同树的黑结点。(好多,见网页)

    http://blog.csdn.net/chenhuajie123/article/details/11951777

    二叉树的遍历:

    1. 深度遍历:前序遍历,中序遍历,后序遍历(递归,栈)

    2. 宽度遍历:层序遍历(队列)

      二叉树的性质

    1. 任意一个二叉树中,叶子结点的个数是n,度为2结点的个数为m。则n=m+1

    2. 满二叉树的第i层上有2^(i-1)个结点

    3. 满二叉树的深度为K,有2^K-1个结点。

    4. 完全二叉树有n个结点,深度是(log2N)+1

    5. 完全二叉树有n个结点,按层次从上到下,从左到右编号,则对于任意结点i(1<=i<=n)有下列性质:

      1. i=1,则该结点是根节点;若i>1,i的父结点是[i/2]

      2. 2i+1<=n,则该结点有左孩子且左孩子的编号为2i,否则无左孩子

      3. 2i+1<=n,则该结点有右孩子,且右孩子编号为2i+1,否则无右孩子

        ============================================================================================================================================

        习题:

    1. 二叉树前序序列是ABCFGDE和中序遍历是BFGCAED,则它的后序序列是:

    2. 正数序列{55,34,18,119,11,76,9,97,99,46},请构造出相应的排序二叉树:

    3. 一份电文只使用5个字符:a,b,c,d,e,他们出现的频率一次为5,2,1,6,4,请画出相应的Hufferman树,并输出每个字符的Hufferman编码。

    4. 红黑树插入情况:无根节点;父结点为黑;父结点为红,叔结点为红;父结点为黑,叔结点为黑或NIL,且属于LR;父结点为黑,叔结点为黑或NIL,且属于LL(解决前要先换PG的颜色)

       

      ============================================================================================================================================

      ===========================================================================================================================================


     

                                                                    图和链表

    1.(少,网页找)

    图:有限结点结合V和链接结点的有限边的集合E的二元组合G=V,E.

    图的存储:邻接矩阵邻接链表

    图的遍历:图的深度优先遍历(DFS) ;图的宽度优先遍历(BFS)

    生成树和最小生成树

    最短路径*

    拓扑排序

    关键路径

    2.链表

    单链表的倒置

    单链表交点

    检测单项循环链表

    双向循环链表

    ============================================================================================================================================

==================================================================================================================================================================

  1.  

     

                                                                                     数据结构习题

    1.采用折半搜索算法长度为n的有序表时,元素的平均搜索长度为()

    A.O(n2)

    B.O(nlog2n)

    C.O(log2n)

    D.O(n)

     

    2.下面程序的时间复杂度为()

    for(int i=0;i<m;i++)

    {

           for(intj=0;j<n;j++)

           {

                  a[i][j]= i * j;

           }

    }

    A.O(m2);

    B.O(n2);

    C.O(m*n);

    D.O(m+n);

     

    3.下列叙述中,正确的是()

    A.线性表中的个元素在存储空间中的位置必须是连续的

    B.线性表中的表头元素一定存储在其他元素的前面

    C.线性表中的个元素在存储空间中的位置不一定是连续的,但表头元素一定存储在其他元素的前面

    D.线性表中的个元素在存储空间中的位置不一定是连续的,且各元素的存储顺序也是任意的

     

    4.已知二叉树后序遍历序列是edcfba,中序遍历序列deacbf,它的前序遍历序列是();

     

    5.如果进栈序列为 e1,e2,e3,e4,则可能的出栈序列是();

     

    6.对长度为n的字符串进行字符定位运算的时间复杂度为();

    A.O(1)   B.O(根号n)  C.O(nlog2n)   D.O(n)

     

    7.n个顶点的连通图中边得条数至少为()

     

    8.合并两个已经排好序的长度为nArray<int>,最坏情况下需要比较多少次()

    A.2n     B.2n-1       C.2n+1        D.n2

     

    9.深度为5的满二叉树中,叶子结点的个数为()

    A.32     B.31         C.16          D.15

     

    10.冒泡排序算法和快速排序算法的时间复杂度分别是什么?

     

    11.请简述数组和链表数据结构的特点及应用的场合?

     

    12.下列哪些数据结构最适合医疗仪器设备中的大型数据量的插入,查找()

    A.数组   B.哈希表    C.红黑树/二叉平衡树    D.链表

     

    13.下列哪些排序算法的平均时间复杂度是O(nlog2n)(),哪些是稳定的排序()

    A.冒泡排序 B.希尔排序 C.快速排序 D.插入排序  E.堆排序

     

     

    14.下列哪些说法是错误的:()

    A.二分查找法在一个长度为1000的有序整数数组查找一个整数,比较的次数不超过100

    B.在二叉树中查找元素的时间复杂度为O(log2n)

    C.对单向链表,可以使用冒泡排序;

    D.对双向链表,可以使用快速排序;

     

    15.已知某二叉树的后序遍历是DFBEGCA,中序遍历的顺序是DBFACEG,其前序遍历顺序是_________________

     

    16.下列代码将两个有序链表结合为一个,链表中的元素的排列顺序为从小到大。请补充其中的空缺。

    struct node{

           struct node *pnext;

           int val;

    };

    struct node*splice(struct node* plhs,struct node* prsh)

    {

           if(_________________)

                  return prhs?prhs:plhs;

           struct node* phead,*plast;

           if(___________________)

           {

                  hpead = plast = plhs;

                  plhs = plhs->pnext;

           }

           else

           {

                  phead = plast = prhs;

                  prhs = prhs->pnext;

           }

           while(_________)

           {

                  if(plhs->val < prhs->val)

                  {

                         plast->pnext = plhs;

                         plast = plhs;

                         plhs = plhs->pnext;

                  }

                  else

                  {

                         plast->pnext = prhs;

                         plast = prhs;

                         prhs = prhs->pnext;

                  }

           }

           plast->pnest = ____________________ ;

           return _______________;

    }

     

     

    17. 比较哈希表和平衡二叉树的特点,他们分别用在哪些场合

     

    18.一个栈的入栈序列是 A,B,C,D,E则栈的不可能的输出序列是()

    A. EDCBA     B. DECBA      C. DCEAB        D.ABCDE

     

     

    19.在排序的方法中,关键码比较次数与记录地初始排列无关的是()

    A.Shell      B.归并排序     C.直接排序     D.选择排序 

     

     

    20.以下反向遍历array数组的方法有什么错误?

    vector array;

    array.push_back(1);

    array.push_back(2);

    array.push_back(3);

    for(vector::size_typei=array.size()-1;i>=0;--i)

    {

           cout << array[i] << endl;

    }

     

     

    21.某火车站要通过一条栈道(先进后出)来调换进入车站的列车顺序,若进站的列车顺序为ABC

    则下列哪个出栈顺序不可能?

    A.ABC          B.ACB              C.CAB                 D.CBA

     

     

    22.栈是一种是只能在某一端插入和删除的特殊线性表。他按照后进先出的原则存储数据,先进入的数据

    被压入栈底,最后进入的数据在栈顶,若6元素进入栈S的顺序为 A.B.C.D.E.F出栈顺序为B.D.C.F.E.A,

    S栈最小容量为?

    A. 3     B. 4    C. 5   D. 6

     

    23.找工作的季节马上就到了,很多同学去图书馆借阅《面试宝典》这本书,现在图书馆外有6名同学排队,

    其中3名同学要将手中的《面试宝典》还至图书馆,有3名同学希望从图书馆中可以接到《面试宝典》,若当

    图书馆内已无库存《面试宝典》,要保证借书的3名同学接到书,请问这6位同学有多少种排队方式?

    A60   B.120     C.180   D.360

     

    24.若完全二叉树的结点个数为2N次方-1,则叶子结点个数为:

    A   N-1       B.2*N        C.2N-1次方       D. 2N次方

     

     

    25.排序算法是稳定是指:关键码相同的记录排序前后对应位置不发生改变,下面哪种排序算法是不稳定的?

    A.插入排序        B.冒泡排序             C.快速排序    D.归并排序

     

     

    26.下列说法中错误的是:

    A.插入排序某些情况下复杂度为O(N)

    B.排序二叉树元素查找的复杂度可能为O(N).

    C.对于有序列表的排序最快的是快熟排序。

    D.在有序列表中通过二分查找的复杂度一定是O(nlog2n)

     

     

    27.栈和队列的共同特点是( 

     

    28.栈通常采用的两种存储结构是(

     

    29.下列关于栈的叙述正确的是(

         A.栈是非线性结构

         B.栈是一种树状结构

         C.栈具有先进先出的特征

         D.栈有后进先出的特征

     

     

    30.链表不具有的特点是(

         A.不必事先估计存储空间

         B.可随机访问任一元素

         C.插入删除不需要移动元素   

         D.所需空间与线性表长度成正比

     

     

    31.用链表表示线性表的优点是(

     

     

    32.循环链表的主要优点是(

     

     

    33.线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(

         A.每个元素都有一个直接前件和直接后件

         B.线性表中至少要有一个元素

         C.表中诸元素的排列顺序必须是由小到大或由大到小

         D.除第一个和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件

     

     

    34.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(

         A.必须是连续的

         B.部分地址必须是连续的

         C.一定是不连续的

         D.连续不连续都可以

     

     

     

    35.树是结点的集合,它的根结点数目是(

     

    36.在深度为5的满二叉树中,结点的个数为(

     

     

    37.具有3个结点的二叉树有()种形态

     

     

    38.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(

     

     

    39.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(

     

     

    40.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFHDBGEACHF,则该二叉树的后序遍历为(

     

     

    41.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(

     

     

    42. 算法一般都可以用哪几种控制结构组合而成(

     

     

    43. 下列叙述正确的是(

    A.算法的执行效率与数据的存储结构无关

    B.算法的空间复杂度是指算法程序中指令(或语句)的条数

    C.算法的有穷性是指算法必须能在执行有限个步骤之后终止

    D.算法的时间复杂度是指执行算法程序所需要的时间

     

     

    44.数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及( 

     

     

    45. 下列叙述中,错误的是(

    A.数据的存储结构与数据处理的效率密切相关

    B.数据的存储结构与数据处理的效率无关

    C.数据的存储结构在计算机中所占的空间不一定是连续的

    D.一种数据的逻辑结构可以有多种存储结构

     

     

     

    46. 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为(

     

     

    47. 下列数据结构中,按先进后出原则组织数据的是(

    A.线性链表  B.栈           C.循环链表       D.顺序表

     

     

     

    48. 下列关于栈的叙述中正确的是(

    A.在栈中只能插入数据

    B.在栈中只能删除数据

    C.栈是先进先出的线性表

    D.栈是先进后出的线性表

     

    49. 应用程序在执行过程中,需要通过打印机输出数据时,一般先形成一个打印作业,将其存放在硬盘中的一个指定()中,

    当打印机空闲时,就会按先来先服务的方式从中取出待打印的作业进行打印。

     

    22.下列关于队列的叙述中正确的是(

    A.在队列中只能插入数据

    B.在队列中只能删除数据

    C.队列是先进先出的线性表           

    D.队列是先进后出的线性表

     

     

    50.某二叉树结点的对称序序列为ABCDEFG,后序序列为BDCAFGE

    该二叉树结点的前序序

    列为 ( )

     

    1. EGFACDB

    2. EACBDGF

    3. EAGCFBD

    4. EGACDFB

     

     

     

     

    51.有一个C语言用来删除单链表的头元素的函数,请找出其中的问题并加以纠正。 

    voidRemoveHead(node* head)

    {

            free(head)

            head=head->next

     

    }

     

    52.设单链表中节点的结构为:

     

     typedef struct node

    {

           Elemtype data; //数据

           struct node* Link; //节点后继指针

    }Listnode;

     

    1)已知指针p所指节点不是尾节点,若在*p之后插入节点*s,则应执行下列哪一个操作?

     

     A s->link=p;p->link=s;

     B s->link=p->link;p->link=s;

     C s->link=p->link;p=s;

     D p->link=s;s->link=p;

     

     (2) 非空的循环单链表 first的尾节点(由p所指向)满足:

     

     A p->link==NULL;

     B p==NULL;

     C p->link==first;

     D p==first;

     

     

     

    53.如何证明一个表是循环链表?

     

     

    54:以下哪一个不是栈的基本运算?

     

     A 删除栈顶元素

     B 删除栈底元素

     C 判断栈是否为空

     D 将栈置为空栈

     

    55heap stack 的差别是什么?

     

    56:如果一棵二叉树节点的前序序列是 ABC,后序序列是CBA,则该二叉树节点的中序序列是什么?

     

     A 必为ABC

     B 必为ACB

     C 必为BCA

     D 不能确定

     

    57:什么是平衡二叉树?

     

     

    58:下面的程序是一快速排序问题,请填空。

     

     #include <iostream>

    #include<stdio.h>

     

    voidimproveqsort(int *list,int m,int n)

    {

           int k,t,i,j;           /*

           for (i=0;i<10;i++)

                  printf("%3d",list[i]);*/

           if(m<n)

           {

                  i=m;j=n+1;k=list[m];

                  while(i<j)

                  {

                         for(i=i+1,i<n.i++)

                                if(list[i]>=k)

                                       break;

                         for(j=j-1,j>m,j--)

                                if(list[j]<=k)

                                       break;

                         if(i<j)

                         {t=list[i];list[i]=list[j];list[j]=t;}

                 

                  }

                  t=list[m];list[m]=list[j];list[j]=t;

                  improveqsort(                 );

                  improveqsort(                 );

     

           }

     

    }

     

    main()

    {

           int list[10];

           int n=9, m=0,i;

           printf("input 10 number:");

           for(i=0;i<10;i++)

                  scanf("%d",&list[i]);

           printf("\n");

           improveqsort(list,m,n);

           for(i=0;i<10;i++)

                  printf("%5d",list[i]);

           printf("\n");

     

     

    }

     

     

     

    59:以下哪种排序属于稳定排序?

     

     A 归并排序

     B 快速排序

     C 希尔排序

     D 堆排序

     

    60:用二分法查找一个长度为10的、排好序的线性表,查找不成功时,最多需要比较多少次?

     

     A 5

     B 2

     C 4

     D 1

     

    61:下面那种排序法对 1234576最快?

     

     A quick sort

     B bubble sort

     C merge sort

     

    62:啥谓哈希表?

     

     

    63:解释一下什么是哈夫曼编码问题?

     

     

     

    二。编程

     

    13.1 单链表

     

    1:编程实现一个单链表的建立。

    2:编程实现一个单链表的侧长。

    3:编程实现一个单链表的打印。

    4:编程实现一个单链表删除节点。

    5:编程实现单链表的插入。

    6:编程实现单链表的逆置。

     

     

    13.2 双链表

     

    面试例题

    1:编程实现双链表的建立。

    2:编程实现双链表的侧长。

    3:编程实现双链表的打印。

    4:编程实现双链表删除节点。

    5:编程实现双链表的插入。

     

     

    1:编程实现队列的入队。

    2:编程实现队列的出队。

    3:编程实现队列的侧长。

    4:编程实现队列的打印。

     

     

     

    1。一个学生的信息:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,

    给出一个age,在这些链表中删除学生年龄等于age的学生信息。

     

    2:请用C C++写出一个冒泡排序程序,要求输入10个整数,输出排序结果。

     

    3:请用C C++写出一个shell排序程序,要求输入10个整数,输出排序结果。

     

     

    3.链表

    struct student

    {

           int m_Num;   //学号

           double m_dScore;  //分数

           struct student* m_pNext; //下一个

    }

    1).构造一个有20名学生的单向链表。按顺序每名学生的分数值为,1,2,3,5,8,13...

    2).求出他们的平均分。

     

     

     

    4.请实现一个快速排序的算法。仅考虑排序的对象为整数的情况。

     

     

     

    5.计算an次方是许多加密算法的基本操作,蛮力计算方法的时间复杂度是O(n),请设计一个

    时间复杂度小于O(n)的算法,(假设计算结果可以使用long型存储)

     

     

     

    6.给定一个数组a[n],我们希望构造数组b[n],其中 b[i] = a[0]*a[1]...a[n-1]/a[i].在构造过程不允许

    使用除法。

    1.要求O(1)空间复杂度和O(n)时间复杂度。

    2.除遍历计数器与a[n]b[n]外,不可使用新的变量(包括栈临时变量,堆空间和全局静态变量等);

     

    int main()

    {

           const int n = 8;

           int a[n] = {1,2,3,4};

           int b[n];

           b[n-1] = 1;

           for (int i=n-2;i>=0;i--)

           {

                  b[i] = b[i+1]*a[i+1];

           }

           for(int i=1;i<n-1;i++)

           {

                  b[n-1]*=a[i-1];

                  b[i]*= b[n-1];

           }

           b[n-1]*=a[n-2];

           for (int i=0;i<n;i++)

           {

                  cout << b[i] << endl;

           }

           return 0;

    }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值