niusouti.com

给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,请设计一个最坏时间复杂度为O(n)的算法,并对其时间复杂度进行分析说明。

题目

给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,请设计一个最坏时间复杂度为O(n)的算法,并对其时间复杂度进行分析说明。


相似考题
更多“给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元”相关问题
  • 第1题:

    假设有一维数组T[O...m*n-1],其中m>n。从数组T的第一个元素(T[0])开始,每隔n个元素取出一个元素依次存入数组B[1...m)中,即B[1]=T[0],B[2]=T[n],依此类推,那么放入B[k](1≤k≤n)的元素是(120)。

    A.T[(K-1)*m]

    B.T[K*n)

    C.T[(K-1)*n]

    D.T[K*m]


    正确答案:C
    解析:代入k=1,得到B[k]=T[0];代入k=2,得到B[k]=T[n]。可见只有T[(K-1)*m)满足要求。

  • 第2题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    [说明]

    这是一个求解Josephus问题的函数。用整数序列1,2,3…,n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。Josephus问题描述,设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,…如此反复直到所有的人全部出局为止。

    [C函数]

    void Josephus(int A[],int n,s,m)

    (int i,j,k,temp;

    if(m==O){

    printf("m=0是无效的参数!\n");

    return;

    }

    for(i=0;i<n;i++) A[i]=i+1; /*初始化,执行n次*/

    i= (1) /*报名起始位置*/

    for(k=n;k>1;k-){

    if((2)) i=0;

    i=(3) /*寻找出局位置*/

    if(i!=k-1){

    tmp=A[i];

    for(j=i;J<k-1;j++) (4);

    (5);

    }

    }

    for(k=0;k<n/2;k++){

    tmp=A[k];A[k]=A[n-k+1];A[n-k+1]=tmp;

    }

    }


    正确答案:(1) s-1 (2) i==k (3) (i+m-1)%k (4) A[j]=A[j+1] (5) A[k-1]=tmp
    (1) s-1 (2) i==k (3) (i+m-1)%k (4) A[j]=A[j+1] (5) A[k-1]=tmp 解析:JosephuS问题是一个经典的顺序表问题,所用到的数据结构就是一维数组。整个算法过程实际上就是一个从n到1的循环。当还剩下k个人的时候,首先找到出局位置,然后将出局者交换到第k-1位置。循环结束,将数组逆置,即得到出局序列。空(1)是赋报名起始位置,应填“s-1”:(2)填“i==k”。空(3)是寻找出局位置,应填“(i+m-1)%k”。数组A的元素要循环向右移动一个位置,则(4)填“A[j]=A[j+1](5)填“A[k-1]=tmp”。

  • 第3题:

    设线性表中有2n个元素,算法( ),在单链表上实现要比在顺序表上实现效率更高。

    A.删除所有值为x的元素

    B.在最后一个匀速的后面插入一个新元素

    C.顺序输出前k个元素

    D.交换第i个元素和第2n-i-1个元素的值(i=0,1,…,n-1)


    正确答案:A

  • 第4题:

    已知有一维数组T[0...m*n-1],其中m>n。从数组T的第一个元素(T[0])开始,每隔n个元素取出一个元素依次存入数组B[1...m]中,即B[1]=T[0],B[2)= T[n],依次类推,那么放入B[k](1≤k≤m)的元素是______。

    A.T[(k-1)*n]

    B.T[k*n]

    C.T[(k-1)*m]

    D.T[k*m]


    正确答案:A
    解析:由题可知,B[1]=T[(1-1)*n],B[2]=T[(2-1)*n],B[3]=T[(3-1)*n],...,根据归纳法可得B[k]=T[(k-1)*n)。

  • 第5题:

    ●试题一

    阅读下列说明和流程图,将应填入(n)处的语句写在答题纸的对应栏内。

    【说明】

    下列流程图用于从数组K中找出一切满足:K(I)+K(J)=M的元素对(K(I),K(J))(1≤I≤J≤N)。假定数组K中的N个不同的整数已按从小到大的顺序排列,M是给定的常数。

    【流程图】

    此流程图1中,比较"K(I)+K(J)∶M"最少执行次数约为 (5) 。

    图1


    正确答案:
    ●试题一【答案】(1)(2)<(3)I+l->I(4)J-1->J(5)「N/2」【解析】该算法的思路是:设置了两个变量I和J,初始时分别指向数组K的第一个元素和最后一个元素。如果这两个元素之和等于M时,输出结果,并这两个指针都向中间移动;如果小于M,则将指针I向中间移动(因为数组K已按从小到大的顺序排列);如果大于M,则将指针J向中间移动(因为数组K已按从小到大的顺序排列)。当IJ时,说明所有的元素都搜索完毕,退出循环。根据上面的分析,(1)、(2)空要求填写循环结束条件,显然,(1)空处应填写"",(2)空处应填写"<"。这里主要要注意I=J的情况,当I=J时,说明指两个指针指向同一元素,应当退出循环。(3)空在流程图有两处,一处是当K(I)+K(J)=M时,另一处是当K(I)+K(J)<M时,根据上面分析这两种情况都要将指针I向中间移动,即"I+1->I"。同样的道理,(4)空处应填写"J-1->J"。比较"K(I)+K(J):M"最少执行次数发生在第1元素与第N个元素之和等于M、第2元素与第N-1个元素之和等于M、……,这样每次比较,两种指针都向中间移动,因此最小执行次数约为"N-2"。

  • 第6题:

    阅读以下说明和C语言函数,将解答填入对应栏内。

    【说明】

    下面待修改的C程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。

    下面给出的C程序代码中有五个错误,请指出所有的错误。

    【C程序代码】

    01 include <stdio.h>

    02

    03 int main()

    04 {

    05 long n, num;

    06 int i;

    07

    08 do {

    09 printf("请输入一个正整数:");

    10 scanf("%ld", n);

    11 }while(n <= 0);

    12 k = 1;

    13 for (i = 1; n >= 0; i++) {

    14 if (i % 2 = 1) {

    15 num= num+ (n % 10) * k;

    16 k = k * 10;

    17 }

    18 n = n / 10;

    19 }

    20 printf("新数据为: %d \n",num);

    21 return 0;

    22 }


    正确答案:错误1:变量k没有声明(或定义)。 错误2:变量num没有初始化或者num应初始化为0。 错误3:第10行scanf函数参数错或者“scanf("%1d"n);”中的n应该为“&n”;或者n之前应加取地址符号。 错误4:第13行循环条件错或改为“n>0”。 错误5:第14行if语句条件错将“=”改为“==”;或者将“1%2=1”改为“i% 2==1 ”
    错误1:变量k没有声明(或定义)。 错误2:变量num没有初始化,或者num应初始化为0。 错误3:第10行scanf函数参数错,或者“scanf("%1d",n);”中的n应该为“&n”;或者n之前应加取地址符号。 错误4:第13行循环条件错,或改为“n>0”。 错误5:第14行if语句条件错,将“=”改为“==”;或者将“1%2=1”改为“i% 2==1 ” 解析:本题考查程序检错和排错能力。
    程序错误一般分成语法错误和语义错误两种类型,其中语法错误是形式上的错误,语义错误是含义上的错误,编译程序能够发现程序中的所有语法错误。
    语义错误又可分为静态语义错误和动态语义错误,静态语义错误编译时检查,而动态语义错误在程序运行时表现。
    C程序中,常见的错误有:使用的变量没有定义、变量没有赋值初就直接使用、输入输出的数据类型与所用格式说明符不一致、超出数据范围、输入时数据的组织方式与要求不符、误把“=”作为关系运算符“等于”、语句的分号缺少或放置错误、缺少“{}”、符号引用错误,“(、)、[、]”括号不配对、引用数组元素超界等。
    在本题的程序中,使用变量num的语句为“num=num+(n%10)*k;”。由于变量 num没有赋初值,该语句运行的结果导致num的值是不确定的。
    在本题给出的程序中,出现了如下错误。
    (1)使用的变量k没有定义(语法错误,编译程序报告:k是未定义的标识符)。
    (2)变量num没有赋初始值就直接使用(动态语义错误),应将其初始值设为0。由于num是局部变量,使用变量num的语句为“num=num+(n%10)*k”,系统不保证对其进行初始化,导致程序的运行结果不确定。
    (3)第14行,误把“=”作为关系运算符“等于”(语法错误),
    (4)第10行,输入变量时忘记使用地址符号(动态语义错误),运行时变量n不能正确接收输入的数据。
    (5)第13行,循环条件错误,导致无穷循环。
    考生应多上机调试程序,这样就可以熟悉常见的程序错误,从而提高编程水平和效率。

  • 第7题:

    以下子例行程序用于实现向一维数组下标为P的数组元素处插入一个整数X
    SUBROUTINE INSERT(B,N,P,X)
    INTEGER B(N),X,P
    DO 20 K=N-1,P,-1
    B(K+1)=______
    20 CONTINUE
    B(P)=X
    END
    为使程序完整,应在______处放入( )。

    A.X
    B.K
    C.B.(P)
    D.B.(K)

    答案:D
    解析:

  • 第8题:

    在多元线性回归模型中对样本容量的基本要求是(k为解释变量个数):( )

    A.n≥k+1
    B.n<k+1
    C.n≥30或n≥3(k+1)
    D.n≥30

    答案:C
    解析:

  • 第9题:

    元素周期表中各种元素的谱线是有规律排列的,并以K,L,M,N…表示若干谱系,对于一个给定的元素,各谱系的能量是:K<L<M<N…


    正确答案:错误

  • 第10题:

    在搜索解图的过程中,若解图的耗散值记为k(n,N),则若n是N的一个元素,则k(n,N)=()

    • A、n
    • B、N
    • C、N-n
    • D、0

    正确答案:D

  • 第11题:

    单选题
    下列说法不正确的是(  )。
    A

    s个n维向量α()1α()2,…,α()s线性无关,则加入k个n维向量β()1β()2,…,β()k后的向量组仍然线性无关

    B

    s个n维向量α()1α()2,…,α()s线性无关,则每个向量增加k维分量后得到的向量组仍然线性无关

    C

    s个n维向量α()1α()2,…,α()s线性相关,则加入k个n维向量β()1β()2,…,β()k后得到的向量组仍然线性相关

    D

    s个n维向量α()1α()2,…,α()s线性无关,则减少一个向量后得到的向量组仍然线性无关


    正确答案: A
    解析:
    A项,一个线性无关组加入k个线性相关的向量,新的向量组线性相关;
    B项,线性无关组的延伸组仍为线性无关组;
    C项,线性相关组加入k个向量,无论k个向量是否相关,构成的新的向量组必是线性相关的;
    D项,线性无关组中的任意个组合均是无关的。

  • 第12题:

    单选题
    在搜索解图的过程中,若解图的耗散值记为k(n,N),则若n是N的一个元素,则k(n,N)=()
    A

    n

    B

    N

    C

    N-n

    D

    0


    正确答案: D
    解析: 暂无解析

  • 第13题:

    已知数组a中有n个元素,下列语句将数组a中从下标x1开始的k个元素移动到从下标x2开始的k个元素中,其中O<=xl<x2<n,x2+k<n,请将下列语句补充完整。

    For(int i=x1+k-1;i>=x1;i--)

    a[______]=a[i];


    正确答案:X2+k-1
    X2+k-1 解析:此题考查的是数组的操作。a[i]表示从下标x1开始的第i个元素,若为第一次循环,则i为xt+k-1,按照题目将数组a中从下标x1开始的k个元素移动到从下标x2开始的k个元素中的要求,所以将a[i]赋值给下标为X2+k-1的元素。

  • 第14题:

    给定一个有n个元素的线性表。若采用顺序存储结构,则在等概率前提下,向其插入一个元素需要移动的元素个数平均为(43)。

    A.n+1

    B.n/2

    C.

    D.


    正确答案:B
    解析:线性表n个元素共有n+1个可能插入的位置,从左到右分别需要移动n,n-1,n-2,n-3,……,0。所以平均移动次数为(n+1)×(n+0)/2(n+1)=n/2。

  • 第15题:

    ●设有二维数组a[1..m,1..n](2<m<n),其第一个元素为a[1,1],最后一个元素为a[m,n],若数组元素以行为主序存放,每个元素占用k个存储单元(k>1),则元素a[2,2]的存储位置相对于数组空间首地址的偏移量为(35)。

    A.(n+1)*k

    B.n*k+l

    C.(m+1)*k

    D.m*k+l


    正确答案:A

  • 第16题:

    若一个栈初始为空,其输入序列是1,2,3…,n-l,n.其输出序列的第一个元素为 k (l≤k≤[n/2]),则输出序列的最后一个元素是(58) 。

    A.值为n的元素

    B.值为1的元素

    C.值为n-k的元素

    D.不确定的


    正确答案:D
    本题考查数据结构基础知识。以n等于4举例说明。输入序列为1234.输出序列的第一个元素可以为1或2。若为1,则输出序列可能为1234、1243、1342、1324、1432;若为2,则输出序列为2134、2143、2314、2341、2431。以上序列都可由合法的入栈、出栈操作序列给出,从中可知无法确定输出序列中最后1个元素的值。

  • 第17题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    [说明]

    函数int psort(int a[],int n)实现将含n个整数的数组a[]的不同元素按从小到大顺序存于数组a[]中。实现方法是从未确定的元素列中找到最小元素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。

    [C函数]

    int psort(int a[],int n)

    {int i,J,k,P;

    for(i=0,k=0;i<(1);i++){

    for(j=i+1, (2) ;j<n; j++)

    if(a[p]>a[j])

    p=j;

    if(p!=i){

    t=a[p];

    a[p]=a[i];

    a[i]=t;

    }

    if( (3) ) k++;

    else if( (4) <a[i])

    (5)=a[i];

    }

    return k;

    }

    int a[]={5,7,5,6,4,3,4,6,7};

    main()

    {int k,n;

    for(k=0;k<(Sizeof a)/Sizeof(int);k++)

    printf("%5d",a[k]);

    printf ("\n\n");

    n=psort(a,(sizeof(a))/sizeof(int));

    for(k=0;k<n;k++)

    printf("%5d",a[k]);

    printf("\n\n");

    }


    正确答案:(1) n-1 (2) P=i (3) k==0 (4) a[k-1] (5) a[k++]
    (1) n-1 (2) P=i (3) k==0 (4) a[k-1] (5) a[k++] 解析:本程序排序方法是从未确定的元素列中找到最小元素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。这是采用选择法对数组元素进行排序,因此空(1)填“n-1”,空(2)填“p=i”。若该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。因此,空(3)填“k==0”;而当a[k-1]a[i]时”,则a[k++]=a[i];否则忽略元素a[i]。所以空(4)填“a[k-1]”空(5)填“a[k++]”。

  • 第18题:

    下面是一个对整数数组A中的前n个元素求最小值的C程序,函数返回最小元素的位置。 Int minValue(int A[],int n){ int k=0: for(int j=1;j<=n-1;j++) if(A[j]<a[k])k=j; return k: 当n=4时,程序中可能的执行路径数为______。

    A.2

    B.4

    C.8

    D.16


    正确答案:B
    解析:当N=4时,程序中的循环一共执行三次,这样就有三个判定结点,所以需要四个基本的测试用例。

  • 第19题:

    若一个栈初始为空,其输入序列是1,2,3,…,n-1,n,其输出序列的第一个元素是k(1≤k≤n/2),则输出序列的最后一个元素是 ( ) 。

    A.1
    B.n
    C.n-1
    D.不确定的

    答案:D
    解析:
    因为题目中没指出出栈的顺序,因此输出的最后一个元素是不确定的。

  • 第20题:

    若一个栈初始为空,其输入序列是1,2,3,…,n-1,n,其输出序列的第一个元素为k(1≤k≤「n/2」),则输出序列的最后一个元素是()。

    • A、值为n的元素
    • B、值为1的元素
    • C、值为n-k的元素
    • D、不确定的

    正确答案:D

  • 第21题:

    在搜索解图的过程中,若解图的耗散值记为k(n,N),则若n是一个外向连接符指向后继节点{n1,…,ni},并设该连接符的耗散值为Cn,则k(n,N)=()

    • A、Cn
    • B、k(n1,N)+…+k(ni,N)
    • C、0
    • D、Cn+k(n1,N)+…+k(ni,N)

    正确答案:D

  • 第22题:

    单选题
    将一个正整数n表示成一系列正整数之和,n=n1+n2+…+nk(其中,n1≥n2≥…≥nk≥1,k≥1)正整数n的一个这种表示称为正整数n的一个划分。正整数n的不同的划分个数总和称为正整数n的划分数,记作p(n);另外,在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记作q(n,m)。则当n=10时,p(n)=()。
    A

    q(8,8)

    B

    1+q(9,9)

    C

    2+q(10,8)

    D

    ABC都正确


    正确答案: A
    解析: 暂无解析

  • 第23题:

    问答题
    给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,请设计一个最坏时间复杂度为O(n)的算法,并对其时间复杂度进行分析说明。

    正确答案: 我们把这种算法叫做快速选择(quickselect)。令〡Si〡为Si中元素的个数,快速选择的步骤如下:
    1)如果〡S〡=1,那么k=1并将S中的元素作为答案返回。如果正在使用小数组的截止方法且〡S〡≤CUTOFF,则将S排序并返回第k个最小元。
    2)选取一个枢纽元v∈S。
    3)将集合S-{v}分割成S1和S2,就像快速排序中所做的那样。
    4)如果k≤〡S1〡,那么第K个最小元必然在S1中。在这种情况下,返回quickselect(S1,k),如果k=1+〡S1
    ,那么枢纽元就是第k个最小元,将它最为答案返回。否则,第k个最小元就在S2中,他是S2中的第(k-〡S1〡-1)个最小元。我们进行一次递归调用并返回quickselect(S2,k-〡S1〡-1)。
    与快速排序对比,快速选择只进行了一次递归调用而不是两次。快速选择的最坏情形和快速排序的相同,也就是O(N=2)。直观看来,这是因为快速排序的最坏情形发生在S1和S2有一个是空的时候;于是,快速选择也就不是真的节省一次递归调用。不过平均运行时间是O(N)。具体分析类似快速排序的分析。
    快速排序的实现甚至比抽象描述还要简单,当算法终止时,第k个最小元就在位置k-1上(因为数组开始于下标0)。这破坏了原来的排序;如果不希望这样,那么需要做一份拷贝。
    解析: 暂无解析