免费智能真题库 > 历年试卷 > 程序员 > 2018年上半年 程序员 下午试卷 案例
  第2题      
  知识点:   直接插入排序   sizeof   查找   排列   排序   数组

 
【说明】
直接插入排序是一种简单的排序方法,具体做法是:在插入第i个关键码时,k1,k2,…,ki-1已经排好序,这时将关键码ki依次与关键码ki-1,ki-2,…,进行比较,找到ki应该插入的位置时停下来,将插入位置及其后的关键码依次向后移动,然后插入ki
例如,对{17,392,68,36}按升序作直接插入排序时,过程如下:
第1次:将392(i=1)插入有序子序列{17},得到{17,392};
第2次:将68(i=2)插入有序子序列{17,392},得到{17,68,392};
第3次:将36(i=3)插入有序子序列{17,68,392},得到{17,36,68,392},完成排序
下面函数insertSort用直接插入排序对整数序列进行升序排列,在main函数中调用insertSort并输出排序结果。
 【C代码】
void insert Sort(int data[],int n)
/*用直接插入排序法将data[0]~ data[n-1]中的n个整数进行升序排列*/
{    int I,j;       int tmp;

     for(i=1; i<n;i++){    
          if(data[i]<data[i-1]){   //将data[i]插入有序子序列data[0]~data[i-1]
                 tmp=data[i];           //备份待插入的元素
                 data[i]=(1);
                 for(j=i-2;j>=0 && data[j] > tmp;j----)        
                                               //查找插入位置并将元素后移
                      (2);
                      (3) =tmp;      //插入正确位置
          }/*if*/
  }/*for*/
}/*insertSort*/

int main()
{       int *bp,*ep;
        int n,arr[]={17,392,68,36,291,776,843,255};
        n = sizeof(arr) / sizeof(int);
        insertSort(arr,n);
        bp=    (4)      ;      ep = arr+n;
        for( ;bp<ep; bp++)             //按升序输出数组元素
             printf("%d\t",          (5)      );
        return 0;
}
 
问题:2.1   (共15分)
阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。
 
 
 

   知识点讲解    
   · 直接插入排序    · sizeof    · 查找    · 排列    · 排序    · 数组
 
       直接插入排序
        若设R[1...n]为待排序的n个记录,R[1...i-1]已按照主关键字由小到大排序,则直接插入排序的主要思路如下。
        (1)寻找R[i]在R[1…i-1]中的插入位置,确保R[i]插入后保持有序。
        (2)i增1,若i小于等于m,则转到(1)执行,否则结束。
        顺序线性存储结构下的直接插入排序算法如下:
        
        【点评】
        (1)对n个结点的线性表采用直接插入排序,当线性表已是从小到大排序时,内循环每执行一次,只需要进行1次比较,整个排序过程只进行n-1次比较。当线性表已是从大到小排序时,对外循环执行i次,内循环要进行i次比较,整个排序过程需要进行n(n-1)/2次比较。可见,对n个结点的线性表采用直接插入排序,最少比较次数为n-1,最多比较次数为n(n-1)/2。
        (2)直接插入排序是在有序表的基础上进行的,所以排序效率较高且比较稳定。
 
       sizeof
        sizeof用于计算表达式或数据类型的字节数,其运算结果与系统相关。例如,对于下面的数组定义,可用“sizeof(a)/sizeof(int)”计算出数组a的元素个数为7。
        
 
       查找
        1)顺序查找
        顺序查找又称线性查找,顺序查找的过程是从线性表的一端开始,依次逐个与表中元素的关键字值进行比较,如果找到其关键字与给定值相等的元素,则查找成功;若表中所有元素的关键字与给定值比较都不成功,则查找失败。
        2)折半查找
        折半查找的过程是先将给定值与有序线性表中间位置上元素的关键字进行比较,若两者相等,则查找成功;若给定值小于该元素的关键字,那么选取中间位置元素关键字值小的那部分元素作为新的查找范围,然后继续进行折半查找;如果给定值大于该元素的关键字,那么选取比中间位置元素关键字值大的那部分元素作为新的查找范围,然后继续进行折半查找,直到找到关键字与给定值相等的元素或查找范围中的元素数量为零时结束。
        3)分块查找
        在分块查找过程中,首先将表分成若干块,每一块中关键字不一定有序,但块之间是有序的。此外,还建立了一个索引表,索引表按关键字有序。分块查找过程需分两步进行:先确定待查记录所在的块;然后在块中顺序查找。
        4)哈希表及其查找
        根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续地址集上,并以关键字在地址集中的像作为记录在表中的存储位置,这种表称为哈希表,也称散列表。这一过程所得到的存储位置称为散列地址,由此形成的查找方法称为散列查找。
 
       排列
        设S为具有n个不同元素的n元集,从S中选取r个元素且考虑其顺序称为S的一个r排列,不同排列的总数记为,有时也用P(nr)表示。如果r=n,则称这个排列为S的全排列。从排列的定义可知,如果两个排列相同,不仅这两个排列的元素必须完全相同,而且排列的顺序也必须完全相同。
        
        例子1:用0~9这十个数字,可以组成多少个没有重复数字的三位数?
        解法1:由于百位数上的数字不能为0,因此可先考虑排百位上的数字,再排十位和个位上的数字。百位数上的数字只能从除0以外的1~9数字中任选一个,有种;十位和个位上的数字,可以从余下的9个数字中任选两个,有种。根据乘法原理,所求的三位数的个数是
        解法2:可先考虑从0~9这十个数字中任取三个数字的排列数(),再减去其中以0开头的排列数()。因此,所求的三位数的个数是
        解法3:符合条件的三位数可以分为三类:每一位数字都不是0的三位数有个;个位数是0的三位数有个;十位数是0的三位数有个。根据加法原理,符合条件的三位数个数是
 
       排序
        假设含n个记录的文件内容为{R1R2,…,Rn},其相应的关键字为{k1k2,…,kn}。经过排序确定一种排列{Rj1Rj2,…,Rjn},使得它们的关键字满足如下递增(或递减)关系:kj1≤kj2≤…≤kjn(或kj1kj2≥…≥kjn)。
 
       数组
               数组的定义及基本运算
               一维数组是长度固定的线性表,数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。
               设有n维数组Ab1b2,…,bn],其每一维的下界都为1,bi是第i维的上界。从数据结构的逻辑关系角度来看,A中的每个元素Aj1j2,…,jn](1≤jibi)都被n个关系所约束。在每个关系中,除第一个和最后一个元素外,其余元素都只有一个直接后继和一个直接前驱。因此就单个关系而言,这n个关系仍是线性的。
               以下面的二维数组Am][n]为例,可以把它看成是一个定长的线性表,它的每个元素也是一个定长线性表。
               
               可将A看作一个行向量形式的线性表:
               Am*n=[[a11a12a1n][a21a22a2n]…[am1am2amn]]
               也可将A看作列向量形式的线性表:
               Am*n=[[a11a21am1][a12a22am2]…[a1na2namn]]
               数组结构的特点如下:
               (1)数据元素数目固定。一旦定义了一个数组结构,就不再有元素的增减变化。
               (2)数据元素具有相同的类型。
               (3)数据元素的下标关系具有上下界的约束且下标有序。
               在数组中通常做下面两种操作:
               (1)取值操作。给定一组下标,读其对应的数据元素。
               (2)赋值操作。给定一组下标,存储或修改与其相对应的数据元素。
               几乎所有的程序设计语言都提供了数组类型。实际上,在语言中把数组看成是具有共同名字的同一类型多个变量的集合。需要注意的是,不能对数组进行整体的运算,只能对单个数组元素进行运算。
               数组的顺序存储
               由于数组一般不作插入和删除运算,也就是说,一旦定义了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动,因此数组适合于采用顺序存储结构。
               对于数组,一旦确定了它的维数和各维的长度,便可为它分配存储空间。反之,只要给出一组下标便可求得相应数组元素的存储位置,也就是说,在数据的顺序存储结构中,数据元素的位置是其下标的线性函数。
               二维数组的存储结构可分为以行为主序(按行存储)和以列为主序(按列存储)两种方法,如下图所示。
               
               二维数组的两种存储方式
               设每个数据元素占用L个单元,mn为数组的行数和列数,那么以行为主序优先存储的地址计算公式为:
               Loc(aij)=Loc(a11)+((i-1)×n+(j-1))×L
               同理,以列为主序优先存储的地址计算公式为:
               Loc(aij)=Loc(a11)+((j-l)×m+(i-1))×L
   题号导航      2018年上半年 程序员 下午试卷 案例   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
 
第2题    在手机中做本题