-->
当前位置:首页 > 题库 > 正文内容

查找与排序练习

Luz4年前 (2021-03-08)题库4637
1-1

在散列表中,所谓同义词就是被不同散列函数映射到同一地址的两个元素。

(1分)
作者
DS课程组
单位
浙江大学
1-1
答案正确
(1 分)

1-2

个元素存入用长度为的数组表示的散列表,则该表的装填因子为

(1分)
作者
DS课程组
单位
浙江大学
1-2
答案正确
(1 分)

1-3

要从50个键值中找出最大的3个值,选择排序比堆排序快。

(2分)
作者
陈越
单位
浙江大学
1-3
答案正确
(2 分)

1-4

内排序要求数据一定要以顺序方式存储。

(2分)
作者
DS课程组
单位
临沂大学
1-4
答案正确
(2 分)

1-5

排序的稳定性是指排序算法中的比较次数保持不变,且算法能够终止。

(2分)
作者
DS课程组
单位
临沂大学
1-5
答案正确
(2 分)
2-1

给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 。如果用大小为10的散列表,并且用平方探测解决冲突,则输入各项经散列后在表中的下标为:(-1表示相应的插入无法成功)

(2分)
作者
DS课程组
单位
浙江大学
2-1
答案正确
(2 分)

2-2

设有一组关键字 { 29,01, 13,15,56,20,87,27,69,9,10,74 },散列函数为 ,采用平方探测方法解决冲突。试在 0 到 18 的散列地址空间中对该关键字序列构造散列表,则成功查找的平均查找长度为 __

(2分)
作者
徐镜春
单位
浙江大学
2-2
答案正确
(2 分)

2-3

对一组数据{ 2,12,16,88,5,10 }进行排序,若前三趟排序结果如下: 第一趟排序结果:2,12,16,5,10,88 第二趟排序结果:2,12,5,10,16,88 第三趟排序结果:2,5,10,12,16,88 则采用的排序方法可能是:

(2分)
作者
DS课程组
单位
浙江大学
2-3
答案正确
(2 分)

2-4

将序列{ 2, 12, 16, 88, 5, 10, 34 }排序。若前2趟排序的结果如下:

  • 第1趟排序后:2, 12, 16, 10, 5, 34, 88

  • 第2趟排序后:2, 5, 10, 12, 16, 34, 88

则可能的排序算法是:

(2分)
作者
陈越
单位
浙江大学
2-4
答案错误
(0 分)

2-5

在内部排序时,若选择了归并排序而没有选择插入排序,则可能的理由是:

  1. 归并排序的程序代码更短

  2. 归并排序占用的空间更少

  3. 归并排序的运行效率更高

(2分)
作者
考研试卷
单位
浙江大学
2-5
答案正确
(2 分)
5-1

本函数的功能是从有N个元素的线性表A中查找第K小的元素。函数的初始调用为Qselect(A, K, 0, N-1)。请完成下列填空。

  1. ElementType Qselect( ElementType A[], int K, int Left, int Right )
  2. {
  3.     ElementType Pivot = A[Left];
  4.     int L = Left, R = Right+1;
  5.  
  6.     while (1) {
  7.         while ( A[++L] < Pivot ) ;        3分;
  8.         if ( L < R ) Swap( &A[L], &A[R] );
  9.         else break;
  10.     }
  11.     Swap( &A[Left], &A[R] );
  12.     if ( K < (L-Left) )
  13.         return Qselect(A, K, Left, R-1);
  14.     else if ( K > (L-Left) )        3分;
  15.     else
  16.         return Pivot;
  17. }
作者
陈越
单位
浙江大学
时间限制
400 ms
内存限制
64 MB
5-1
部分正确
(3 分)

5-2

本函数的功能是从有N个元素的线性表A中查找第K大的元素。函数的初始调用为Qselect(A, K, 0, N-1)。请完成下列填空。

  1. ElementType Qselect( ElementType A[], int K, int Left, int Right )
  2. {
  3.     ElementType Pivot = A[Left];
  4.     int L = Left, R = Right+1;
  5.  
  6.     while (1) {
  7.         while ( A[++L] > Pivot ) ;        3分;
  8.         if ( L < R ) Swap( &A[L], &A[R] );
  9.         else break;
  10.     }
  11.     Swap( &A[Left], &A[R] );
  12.     if ( K < (L-Left) )
  13.         return Qselect(A, K, Left, R-1);
  14.     else if ( K > (L-Left) )        3分;
  15.     else
  16.         return Pivot;
  17. }
作者
陈越
单位
浙江大学
时间限制
400 ms
内存限制
64 MB
5-2
部分正确
(3 分)
6-1 划分整数数组 (10 分)

由n个正整数构成的集合A{ak}, 将其划分为两个不相交的子集A1,A2, 元素个数分别是n1,n2, A1和A2中的元素之和分别是S1,S2。 设计一个尽可能高效的划分算法,满足|n1-n2|最小,且|S1-S2|最大,返回|S1-S2|的结果。 注意:函数头已经给出,只需要写出函数体。

函数接口定义:

  1. int Partition(int a[],int n);  //  将数组a的整数集合划分成两个不相关子集,使得|n1-n2|最小,且|S1-S2|最大,返回|S1-S2|的结果。

裁判测试程序样例:

  1. #include<stdio.h>int Partition(int a[],int n);int main(){    int a[60000],n;    scanf("%d",&n);    for(int i=0;i<n;i++)
  2.     {        scanf("%d",&a[i]);
  3.     }    printf("%d\n",Partition(a,n));
  4. }int Partition(int a[],int n){/* 请在这里填写答案,仅写出函数体,不需要写函数头以及“{”,“ }”*/
  5.  //划分整数数组算法}

输入样例:

在这里给出一组输入。例如:

  1. 6
  2. 1 9 20 8 100 15

输出样例:

在这里给出相应的输出。例如:

  1. 117
  1. int pivotkey,low=0,low0=0,high=n-1,high0=n-1,flag=1,k=n/2,i;
  2. int s1=0,s2=0;
  3. while(flag){
  4.     pivotkey=a[low];
  5.     while(low<high){
  6.         while(low<high && a[high]>=pivotkey){
  7.             --high;
  8.         }
  9.         if(low!=high){
  10.             a[low]=a[high];
  11.         }
  12.         while(low<high && a[low]<pivotkey){
  13.             ++low;
  14.         }
  15.         if(low!=high){
  16.             a[high]=a[low];
  17.         }
  18.     }
  19.     a[low]=pivotkey;
  20.     if(low==k-1) flag=0;
  21.     else{
  22.         if(low<k-1){
  23.             low0=++low;
  24.             high=high0;
  25.         }
  26.         else{
  27.             high0=--high;
  28.             low=low0;
  29.         }
  30.     }
  31. }
  32. for(i=0;i<k;i++){
  33.     s1+=a[i];
  34. }
  35. for(i=k;i<n;i++){
  36.     s2+=a[i];
  37. }
  38. return s2-s1;
6-2 二分查找 (20 分)

本题要求实现二分查找算法。

函数接口定义:

  1. Position BinarySearch( List L, ElementType X );

其中List结构定义如下:

  1. typedef int Position;typedef struct LNode *List;struct LNode {
  2.     ElementType Data[MAXSIZE];
  3.     Position Last; /* 保存线性表中最后一个元素的位置 */};

L是用户传入的一个线性表,其中ElementType元素可以通过进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找XData中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound

裁判测试程序样例:

  1. #include <stdio.h>#include <stdlib.h>#define MAXSIZE 10#define NotFound 0typedef int ElementType;typedef int Position;typedef struct LNode *List;struct LNode {
  2.     ElementType Data[MAXSIZE];
  3.     Position Last; /* 保存线性表中最后一个元素的位置 */};List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */Position BinarySearch( List L, ElementType X );int main(){
  4.     List L;
  5.     ElementType X;
  6.     Position P;
  7.  
  8.     L = ReadInput();    scanf("%d", &X);
  9.     P = BinarySearch( L, X );    printf("%d\n", P);    return 0;
  10. }/* 你的代码将被嵌在这里 */

输入样例1:

  1. 5
  2. 12 31 55 89 101
  3. 31

输出样例1:

  1. 2

输入样例2:

  1. 326 78 23331

输出样例2:

  1. 0

鸣谢宁波大学 Eyre-lemon-郎俊杰 同学修正原题!

作者
陈越
单位
浙江大学
代码长度限制
16 KB
时间限制
100 ms
内存限制
64 MB
  1. Position BinarySearch(List L, ElementType X)
  2. {
  3.       ElementType left = 1;
  4.       ElementType right = L->Last;
  5.       ElementType mid;
  6.   
  7.       while(left<=right) {
  8.           mid = (left+right)/2;
  9.           if(== L->Data[mid]) {
  10.              return (mid);
  11.          } else if(< L->Data[mid]) {
  12.              right = mid-1;
  13.          } else {
  14.              left = mid+1;
  15.          }
  16.      }
  17.      return NotFound;
  18.  }
返回列表

上一篇:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。