给定一组长度为n的无序序列,将其存储在一维数组a[O..n-1]中。现采用如下方法找出其中的最大元素和最小元素:比较a[O]和a[n-1],若a[0]较大,则将二者的值进行交换;再比较a[1]和a[n-2],若a[1]较大,则交换二者的值;然后依次比较a[2]和a[n-3]、a[3]和a[n-4]、…,使得每一对元素中的较小者被交换到低下标端。重复上述方法,在数组的前n/2个元素中查找最小元素,在后n/2个元素查找最大元素,从而得到整个序列的最小元素和最大元素。上述方法采用的算法设计策略是( )。A.动态规划法B.贪心法C.分治法D.回溯法

给定一组长度为n的无序序列,将其存储在一维数组a[O..n-1]中。现采用如下方法找出其中的最大元素和最小元素:比较a[O]和a[n-1],若a[0]较大,则将二者的值进行交换;再比较a[1]和a[n-2],若a[1]较大,则交换二者的值;然后依次比较a[2]和a[n-3]、a[3]和a[n-4]、…,使得每一对元素中的较小者被交换到低下标端。重复上述方法,在数组的前n/2个元素中查找最小元素,在后n/2个元素查找最大元素,从而得到整个序列的最小元素和最大元素。上述方法采用的算法设计策略是( )。

A.动态规划法
B.贪心法
C.分治法
D.回溯法

参考解析

解析:

相关考题:

对n个元素值分别为-1、0或1的整型数组A进行升序排序的算法描述如下:统计A中-1、0和1的个数,设分别为n1、n2和n3,然后将A中的前n1个元素赋值为-1,第n1+1到n1+n2个元素赋值为0,最后n3个元素赋值为1。该算法的时间复杂度和空间复杂度分别为()。 A.(n)和(1)B.(n)和(n)C.(n2)和(1)D.(n2)和(n)

有n个元素的数组,查找其中最大值的元素,一般需要()次元素的比较 。 A.1B.nC.n+1D.n-1

● 设有一个初始为空的栈,若输入序列为 1、2、3、…、n(n3),且输出序列的第一个元素是 n-1,则输入序列中所有元素都出栈后,(37)。(37)A.元素 n-2 一定比n-3 先出栈B.元素 1~n-2 在输出序列中的排列是不确定的C.输出序列末尾的元素一定为 1D.输出序列末尾的元素一定为 n

用数组A[0,N-1]存放循环队列的元素值,若其头指针和尾指针分别为front和rear,则循环队列中当前元素的个数为A.(rear-front+N+1)mod NB.(rear-front+1)mod NC.(rear-front-1+N)mod ND.(rear-front)mod N

阅读以下说明和C语言函数,将应填入(n)处。[说明]函数int find_Max_Min(int a[],int n)的功能是:找出n个元素的数组a中的最大元素和最小元素并输出,返回查找过程中元素的比较次数。查找方法如下:比较a[0]和a[n-1],若a[0]大,则交换a[0]和a[n-1]的值:再比较a[1]和a[n-2],若a[1]大,则交换a[1]和a[n-2]的值;以此类推,直到所有的元素都比较完。然后在数组的前半区从前往后找出小元素,在后半区从后往前找出大元素。[函数]int find_Max_Min(int a[],int n){/*找出n个元素的数组a的最大、最小元素并输出,返回查找过程元素中的比较次数*/int i,Count=0;int temp,Maxnum,Minnum;for(i=0; i<n/2; i++){Count=Count+1 /*元素比较次数计数*/if(a[i]>a[(1)]){/*数组元素交换代码略*/}}Maxnum=a[n-1]; Minnum=a[0];for(i=1;i<n/2+n%2;i++){Count=(2); /*元素比较次数计数*/Minnum=(3)? a[i]:Minnum; /*找最小元素*/Maxnum=(4)?(5):Maxnum; /*找最大元素*/}printf("Max=%d\n",Maxnum);printf("Min=%d\n",Minnum);return Count;}

● 两个递增序列 A和 B的长度分别为 m和 n(mn) ,将二者归并为一个长度为 m+n的递增序列时, (42) ,归并过程中元素的比较次数最少。(42)A. 当 A的最大元素大于 B 的最大元素时B. 当 A的最大元素小于 B 的最小元素时C. 当 A的最小元素大于 B 的最小元素时D. 当 A的最小元素小于 B 的最大元素时

在一个长度为n的顺序线性表中顺序查找值为x的元素时,查找成功时的平均查找长度(即x与元素的平均比较次数,假定查找每个元素的概率都相等)为(). AnBn/2C(n+1)/2D(n-1)/2

阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。【说明】函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素s[0]~9[n-1]循环向右平移k个位置。为了达到总移动次数不超过n的要求,每个元素都必须只经过一次移动到达目标位置。在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算应移动到a[0]的元素的下标 p,并将a[P]的值移至a[0];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至 a[p];依次类推,直到将a[0]的备份值移到正确位置。若此时移动到位的元素个数已经为n,则结束;否则,再备份a[1]的值,然后计算应移动到a[1]的元素的下标p,并将a[p]的值移至9[1];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[1]的备份值移到正确位置。若此时移动到位的元素个数已经为n,则结束;否则,从a[2]开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。例如,数组a中的6个元素如图1(a)所示,循环向右平移两个位置后元素的排列情况如图1(b)所示。void rcr( int a[] ,int n,int k){ int i,j,t,temp,count;count =0; /*记录移动元素的次数*/k=k%n;if((1)){ /*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/i=0while(count<n) {j=i;t=i;temp =a[1]; /*备份a[i]的值*//*移动相关元素,直到计算出a[i]应移动到的目标位置*/while((j=(2))! =i){a[t]=a[j];t=(3);count++;}(4)= temp;count ++;(5);}}}

阅读以下说明和流程图,回答问题将解答填入对应栏。[说明]本流程图实现采用递归函数来求一个整数数组中从元素0到元素n中的最小值。该算法思想是这样的,首先我们假设有一个求数组中最小元素的函数,然后,在求某一具有n的元素的数组的最小值时,只要求将前n-1的元素的最小值与第n个元素比较即可。不断地重复这一过程,直到数组中只剩下一个元素,那么它必定是最小值。注:int min(int X,int y)为返回两数中最小数的函数。int minInArray(int a[],int n)为返回数组中最小数的函数。minA为数组中最小值。[问题l]将流程图的(1)~(4)处补充完整。[问题2]min()函数的定义为(5)。

设有一个初始为空的栈,若输入序列为1、2、3、…、n(n3),且输出序列的第一个元素是n-1,则输入序列中所有元素都出栈后,( )。A.元素n-2一定比n一3先出栈B.元素1~n-2在输出序列中的排列是不确定的C.输出序列末尾的元素一定为1D.输出序列末尾的元素一定为n

在一个堆的顺序存储中,若一个元素的下标为i(0≤i≤n-1),则它的左孩子元素的下标为【 】。

给定一组长度为n的无序序列,将其存储在一维数组a[O..n-1]中。现采用如下方法找出其中的最大元素和最小元素:比较a[O]和a[n-1],若a[0]较大,则将二者的值进行交换;再比较a[1]和a[n-2],若a[1]较大,则交换二者的值;然后依次比较a[2]和a[n-3]、 a[3]和a[n-4]、…,使得每一对元素中的较小者被交换到低下标端。重复上述方法,在数组的前n/2个元素中查找最小元素,在后n/2个元素查找最大元素,从而得到整个序列的最小元素和最大元素。上述方法采用的算法设计策略是(64)。A.动态规划法B.贪心法C.分治法D.回溯法

●设下三角矩阵(上三角部分的元素值都为 0)A[0..n,0..n]如下所示,将该三角矩阵的所有非零元素(即行下标不小于列下标的元素)按行优先压缩存储在容量足够大的数组M[ ]中(下标从1 开始),则元素 A[I,j](O≤i≤n,j≤i)存储在数组M 的 (57) 中。

编程,找出长度为10\的数组中,数组元素的最大值和最小值,并输出。

将数据元素2,4,6,8,10,12,14,16,18,20依次存放于一个一维数组中,然后采用折半查找方法查找数组元素12,被比较过的数组元素的下标依次为(52)。A.10,16,12B.10,12,16C.5,8,6D.5,6,8

对于长度为n的线性表(即n个元素构成的序列),若采用顺序存储结构(数组存储),则在等概率下,删除一个元素平均需要移动的元素数为( )。A.nB.(n-1)/2C. N/2D.Log n

阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。 【说明】 设有整数数组A[1:N](N1),其元素有正有负。下面的流程图在该数组中寻找连续排列的若干个元素,使其和达到最大值,并输出其起始下标K、元素个数L以及最大的和值M。 例如,若数组元素依次为3,-6,2,4,-2,3,-1,则输出K=3,L=4,M=7。该流程图中考察了A[1:N]中所有从下标i到下标j(ji)的各元素之和S,并动态地记录其最大值M。【流程图】注:循环开始框内应给出循环控制变量的初值和终值,默认递增值为1,格式为:循环控制变量=初值,终值

阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素a[0]~a[n-1]循环向右平移k个位置。为了达到总移动次数不超过n的要求,每个元素都必须只经过一次移动到达目标位置。在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算应移动到a[0]的元素的下标p,并将a[p]的值移至a[0];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[0]的备份值移到正确位置。若此时移动到位的元素个数已经为n,则结束;否则,再备份a[1]的值,然后计算应移动到a[1]的元素的下标p,并将a[p]的值移至a[1];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[1]的备份值移到正确位置。若此时移动到位的元素个数已经为n,则结束;否则,从a[2]开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。例如,数组a中的6个元素如图1(a)所示,循环向右平移两个位置后元素的排列情况如图1(b)所示。【函数】void rcr(int a[],int n,int k){int i,j,t,temp,count;count=0;/*记录移动元素的次数*/k=k%n;if( (1) ){/*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/i=0;while(countn){j=i;t=i;temp=a[i];/*备份a[i]的值*//*移动相关元素,直到计算出a[i]应移动到的目标位置*/while((j= (2) )!=i){a[t]=a[j];t= (3) ;count++;}(4) =temp;count++;(5) ;}}}

试题三(共15分)阅读以下说明和C函数,回答问题 l和问题 2,将解答填入答题纸的对应栏内。【说明】对于具有n个元素的整型数组a,需要进行的处理是删除a中所有的值为 0的数组元素,并将a中所有的非 O元素按照原顺序连续地存储在数组空间的前端。下面分别用函数CompactArr_v1 和CompactArr v2来实现上述处理要求,函数的返回值为非零元素的个数。 函数CompactArr_vl(int a[],int n)的处理思路是:先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组a的每一个元素,将遇到的非O元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。函数CompactArr_v2(int a[],int n)的处理思路是:利用下标i(初值为 0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组 a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增 1,而遇到非 0元素并将其前移后k才增 1。【问题1】 (12分)请根据说明中函数CompactArr_v1的处理思路填补空缺(1)~(3),根据CompactArr_v2的处理思路填补空缺(4)。【问题2】(3分)请说明函数CompactArr vl存在的缺点。

● 给定一组长度为n的无序序列,将其存储在一维数组a[0..n-1]中。现采用如下方法找出其中的最大元素和最小元素:比较 a[0]和 a[n-1],若 a[0]较大,则将二者的值进行交换;再比较a[1]和a[n-2],若a[1]较大,则交换二者的值;然后依次比较a[2]和a[n-3]、a[3]和 a[n-4]、…,使得每一对元素中的较小者被交换到低下标端。重复上述方法,在数组的前 n/2 个元素中查找最小元素,在后 n/2 个元素查找最大元素,从而得到整个序列的最小元素和最大元素。上述方法采用的算法设计策略是 (64) 。(64)A. 动态规划法B. 贪心法C. 分治法D. 回溯法

●对数据组R[1..n]中的n个元素进行排序的某一种方法描述如下:step1:令h=n;step2:进行h-1次比较,从R[1],R[2],…,R[h]中找出最大的元素R[i](1≤i≤h);step3:若i≠h,则交换R[i]和R[h] step4:令h=h-1;step5:若h=1,则排序完成,否则转向step2。对上述排序方法,下列选项中不正确的是 ()。()A.排序过程中,元素的交换次数至少为0次B.排序过程中,元素的交换次数至多为n-1次C.方法是稳定的D.方法是不稳定的

第二题 阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】对n个元素进行简单选择排序的基本方法是:第一趟从第1个元素开始,在n个元素中选出最小者,将其交换至第一个位置,第二趟从第2个元素开始,在剩下的n-1个元素中选出最小者,将其交换至第二个位置,依此类推,第i趟从n-i+1个元素中选出最小元素,将其交换至第i个位置,通过n-1趟选择最终得到非递减排序的有序序列。 问题:2.1 【代码】#include void selectSort(int data[ ],int n)//对 data[0]~data[n-1]中的n个整数按非递减有序的方式进行排列{ int i,j,k; int temp; for(i=0;i for(k=i,j=i+1;(1);(2)) //k表示data[i]~data[n-1]中最小元素的下标 if(data[j] if(k!=i) { //将本趟找出的最小元素与data[i]交换 temp=data[i]; (4) ;data[k]=temp; } }}int main(){ int arr[ ]={79,85,93,65,44,70,100,57}; int i,m; m=sizeof(arr)/sizeof(int); //计算数组元素的个数,用m表示 (5); //调用selectSort对数组arr进行非递减排序 for((6);i printf(“%d\t”,arr[i]); printf(“\n”); return 0;}

第四题 阅读以下说明、C函数和问题,回答问题1和问题2将解答填入答题纸的对应栏内。【说明】当数组中的元素已经排列有序时,可以采用折半查找(二分查找)法查找一个元素。下面的函数biSearch(int r[],int low,int high,int key)用非递归方式在数组r中进行二分查找,函数biSearch_rec(int r[],int low,int high,int key)采用递归方式在数组r中进行二分查找,函数的返回值都为所找到元素的下标;若找不到,则返回-1。【C函数1】int biSearch(int r[],int low,int high,int key)//r[low..high] 中的元素按非递减顺序排列//用二分查找法在数组r中查找与key相同的元素//若找到则返回该元素在数组r的下标,否则返回-1{ int mid; while((1)) { mid = (low+high)/2 ; if (key ==r[mid]) return mid; else if (key (2); else (3); }/*while*/ return -1;}/*biSearch*/【C 函数 2】int biSearch_rec(int r[],int low,int high,int key)//r[low..high]中的元素按非递减顺序排列//用二分查找法在数组r中查找与key相同的元素//若找到则返回该元素在数组r的下标,否则返回-1{ int mid; if((4)) { mid = (low+high)/2 ; if (key ==r[mid]) return mid; else if (key return biSearch_rec((5),key); else return biSearch_rec((6),key); }/*if*/ return -1;}/*biSearch_rec*/ 问题:4.1 (12分)请填充C函数1和C函数2中的空缺,将解答填入答题纸的对应栏内。 问题:4.2 (3分)若有序数组中有n个元素,采用二分查找法查找一个元素时,最多与( )个数组元素进行比较,即可确定查找结果。(7)备选答案:A.[log2(n+1)] B.[n/2] C.n-1 D.n

若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为()。A.9,5,3B.9,5,2,3C.1,2,3D.9,4,2,3

若有以下数组a,数组元素:a[0]~a[9],其值为 9  4  12  8  2  10  7  5  1  3   该数组的元素中,数值最大的元素的下标值是()

在一个长度为n的线性表中顺序查找值为x的元素时,查找时的平均查找长度(即x同元素的平均比较次数,假定查找每个元素的概率都相等)为()。A、nB、n/2C、(n+1)/2D、(n-1)/2

数组中元素的最大值就是下标最大的那个数组元素无需进行比较

单选题对n个元素值分别为-1、0或1的整型数组A进行升序排序的算法描述如下:统计A中-1、0和1的个数,设分别为n1、n2和n3,然后将A中的前n1个元素赋值为-1,第n1+1到n1+n2个元素赋值为0,最后n3个元素赋值为1。该算法的时间复杂度和空间复杂度分别为()。AΘ(n)和Θ(1)BΘ(n)和Θ(n)CΘ(n2)和Θ(1)DΘ(n2)和Θ(n)