给定包含n个正整数的数组A和正整数x,要判断数组A中是否存在两个元素之和等于x,先用插入排序算法对数组A进行排序,再用以下过程P来判断是否存在两个元素之和等于x。low=1;high=n;while(high>low)if A[low]+A[high]=x return true;else if A[low]+A[high]>x low++;else high--;return false;则过程P的时间复杂度为( ),整个算法的时间复杂度为(请作答此空)。A.O(n)B.O(nlgn)C.O(n2)D.O(n2lgn)

给定包含n个正整数的数组A和正整数x,要判断数组A中是否存在两个元素之和等于x,先用插入排序算法对数组A进行排序,再用以下过程P来判断是否存在两个元素之和等于x。low=1;high=n;while(high>low)if A[low]+A[high]=x return true;else if A[low]+A[high]>x low++;else high--;return false;则过程P的时间复杂度为( ),整个算法的时间复杂度为(请作答此空)。

A.O(n)
B.O(nlgn)
C.O(n2)
D.O(n2lgn)

参考解析

解析:本题考查时间复杂度的基本知识。第一空有一层循环while,遍历判断,所以时间复杂度为n;第二空如图所示:插入排序的时间复杂为O(n2) ;故第一空正确答案为A;第二空正确答案为C;

相关考题:

●试题六阅读以下说明和C++程序,将应填入(n)处的字句写在答题纸的对应栏内。【说明】设计一个类模板Sample用于对一个有序数组采用二分法查找元素下标。【C++程序】#includeiostream.h#define Max 100∥最多元素个数templateclass Tclass Sample{T A[Max]:∥存放有序数序int n:∥实际元素个数publicSample(){}∥默认构造函数Sample(T a[],int i);∥初始化构造函数int seek(T c);void disp(){for(int i=0;in;i++)coutA[i]"";coutend1:}};templateclass TSampleT::Sample(T a[],int i){n=i;for(intj=0;ji;j++)(1) ;}templateclass Tint SampleT::seek(T c){int low=0,high=n-1,mid;while( (2) ){mid=(low+high)/2;if( (3) )return mid;else if( (4) )low=mid+l;else(5) ;}return-1;}void main(){char a[]="acegkmpwxz";Samplechars(a,1。);cout"元素序列:";s.disp();cout"元素′g′的下标:"s.seek(′g′)endl;}

ENUM类型的字段level定义为(LOW、MIDDLE、HIGH),ORDERBYlevelasc的顺序是() A、HIGH、LOW、MIDDLEB、LOW、MIDDLE、HIGHC、MIDDLE、LOW、HIGHD、HIGH、MIDDLE、LOW

●试题一阅读下列算法说明和算法,将应填入(n)处的语句写在答题纸的对应栏内。【说明】为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R[1..n]进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置(假设R[]中的元素互不相同)。【算法】1.变量声明X:DataTypei,j,low,high,mid,R0..n2.每循环一次插入一个R[i]循环:i以1为步长,从2到n,反复执行①准备X-R[i]; (1) ;high-i-1;②找插入位置循环:当 (2) 时,反复执行(3)若X.keyR[mid].key则high-mid-1否则 (4)③后移循环:j以-1为步长,从 (5) ,反复执行R[j+1]-R[j]④插入R[low]-X3.算法结束

●试题三阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】函数move(int*a,int n)用于整理数组a[]的前n个元素,使其中小于0的元素移到数组的前端,大于0的元素移到数组的后端,等于0的元素留在数表中间。令a[0]~a[low-1]小于0(初始为空);a[low]~a[i-1]等于0(初始为空);a[i]~a[high]还未考察,当前考察元素为a[i]。a[high+1]~a[n-1]大于0(初始为空)。【函数】move(int*a,int n){int i,low,high,t;low=i=0;high=n-1;while( (1) )if(a[i]0){t=a[i];a[i]=a[low];a[low]=t;(2) ;i++;}else if( (3) ){t=a[i];a[i]=a[high];a[high]=t;(4) ;}else (5) ;}

N个有序整数数列已放在一维数组中,给定下列程序中,函数fun()的功能是:利用折半查找算法查找整数m在数组中的位置。若找到,则返回其下标值:反之,则返回-1。折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和high(low<high),然后把m与中间位置(mid)中元素的值进行比较。如果m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之后的元素中;反之,下次查找范围落在中间位置之前的元素中。直到low>high,查找结束。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:include <stdio.h>define N 10/*************found*********************/void fun(int a[],int m){ int low--0,high=N-l,mid;while (low<=high){ mid=(low+high)/2;if(m<a[mid])high=mid-1;/*************found*********************/else if(m>=a [mid])low=mid+1;else return(mid);}return(-1);}main (){ int i,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m;printf ("a数组中的数据如下: ");for(i=0;i<N;i++) printf("%d",a[i]);printf ("Enter m: "); scanf ("%d", m);k=fun (a,m);if (k>=0) printf ("m=%d, index=%d\n",m, k);else printf("Not be found!\n");}

阅读下列算法说明和算法,将应填入(n)处的语句写在对应栏内。【说明】为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R[1..n]进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置。(假设R[]中的元素互不相同)[算法]1.变量声明X: Data Typei,j,low, high,mid,r:0..n2.每循环一次插入一个R[i]循环:i以1为步长,从2到n,反复执行。(1)准备X←R[i];(1); high←i-1;(2)找插入位置循环:当(2)时,反复执行。(3)若X.key<R[mid].key则high←mid-1;否则 (4)(3)后移循环:j以-1为步长,从(5),反复执行。R[j+1]←R[j](4)插入R[low]←X3.算法结束

阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。【说明】设计一个类模板SamPle用于对一个有序数组采用二分法查找元素下标。【C++程序】include < iostream. h >define Max 100 //最多元素个数template < class T >class Sample{T A[Max]: //存放有序数序int n: //实际元素个数publicSample( ) { } //默认构造函数Sample(T a[] ,int i); //初始化构造函数int seek(T c);void disp( ){for(int i=0;i <n;i ++)cout<<A[i] <<" ";cout<<endl:} } template < class T >Sample <T>: :Sample(T a[ ],int i){n=i:for( intj =0;j < i;j ++ )(1);}template < class T >int Sample < T >:: seek( T c){int low =0,high = n-1 ,mid;while((2)){mid = (low + high)/2;if((3))return mid;else if( (4) )low=mid+|;else(5);}return-1;}void main( ){char a[ ] ="acegkmpwxz";Sample < char > s(a, 1);cout<<"元素序列:" ;s. disp( );cout<<"元素'g'的下标:"<<s. seek('g') <<endl;}

阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明1]本程序输入一字符串,并将其中的大写字母变成小写字母。[C函数1]include<stdio.h>void main(){ int i=0;char s[120];printf("Enter a string.\n");scanf("%s",s);while( (1) ){if( (2) )s[i]=s[i]-'A'+'a';i++;}printf("%s\n",S);}[说明2]本程序用二分法,在已按字母次序从小到大排序的字符数组list[len]中,查找字符c,若c在数组中,函数返回字符c在数组中的下标,否则返回-1。[C函数2]int search(char list[],char c,int len)( intlow=0,high=len-1,k;while( (3) );k=(10w+high)/2;if( (4) ) return k;else if( (5) )high=k-1;else low=k+1;return -1;}

The desirable properties of a marine fuel oil should include .A.high flash point and high viscosityB.low flash point and high viscosityC.low heating value and high sulphur contentD.high heating value and low sulphur content

阅读下列说明、流程图和算法,将应填入(n)处的字句写在对应栏内。【流程图说明】下图所示的流程图5.3用N-S盒图形式描述了数组Array中的元素被划分的过程。其划分方法;以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于Array[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。【算法说明】将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数int p(int Array[],int low,int high)实现了上述流程图的划分过程并返回基准数在数组Ar ray中的下标。递归函数void sort(int Array[],int L,int H)的功能是实现数组Array中元素的递增排序。【算法】void sort(int Array[],int L,int H){if (L<H) {k=p(Array,L,H);/*p()返回基准数在数组Array中的下标*/sort((4));/*小于基准数的元素排序*/sort((5));/*大于基准数的元素排序*/}}

阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 下面的程序利用快速排序中划分的思想在整数序列中找出第k小的元素(即将元素从小到大排序后,取第k个元素)。 对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序的序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。 例如,整数序列19, 12, 30, 11,7,53, 78, 25的第3小元素为12。整数序列19,12,7,30,11,11,7,53,78,25,7的第3小元素为7。 函数partition(int a[ ], int low,int high)以a[low]的值为基准,对a[low]、a[low+1]、、 a[high]进行划分,最后将该基准值放入a[i] (lowihigh),并使得a[low]、a[low+1]、,..、 A[i-1]都小于或等于a[i],而a[i+1]、a[i+2]、..、a[high]都大于a[i]。 函教findkthElem(int a[],int startIdx,int endIdx,inr k)在a[startIdx]、a[startIdx+1]、...、a[endIdx]中找出第k小的元素。【代码】 include stdio.h include stdlib.h Int partition(int a [ ],int low, int high) {//对 a[low..high]进行划分,使得a[low..i]中的元素都不大于a[i+1..high]中的元素。 int pivot=a[low]; //pivot表示基准元素 Int i=low,j=high; while(( 1) ){ While(ija[j]pivot)--j; a[i]=a[j] While(ija[i]=pivot)++i; a[j]=a[i] } (2) ; //基准元素定位 return i; } Int findkthElem(int a[ ],int startIdx,int endIdx, int k) {//整数序列存储在a[startldx..endldx]中,查找并返回第k小的元素。 if (startldx0 ||endIdx0 || startIdxendIdx || k1 ||k-1endIdx ||k-1startIdx) Return-1; //参数错误 if(startIdxendldx){ int loc=partition(a, startIdx, endldx); ∥进行划分,确定基准元素的位置 if (loc==k-1) ∥找到第k小的元素 return (3) ; if(k-1 loc) //继续在基准元素之前查找 return findkthElem(a, (4) ,k); else //继续在基准元素之后查找 return findkthElem(a, (5) ,k); } return a[startIdx]; } int main() { int i, k; int n; int a[] = {19, 12, 7, 30, 11, 11, 7, 53, 78, 25, 7}; n= sizeof(a)/sizeof(int) //计算序列中的元素个数 for (k=1;k<n+1;k++){ for(i=0;i<n;i++){ printf(%d/t,a[i]); } printf(\n); printf(elem %d=%d\n,k,findkthElem(a,0,n-1,k));//输出序列中第k小的元素 } return 0; }

若有char *x[2]={"xyzw","XYZW"};则下面的表述正确的是 ______。A.x数组元素酌值分别是“xyzw”和“XYZW”B.x是指针变量,它指向含有两个数组元素的字符型一维数组C.x数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址D.x数组的两个元素中各自存放了字符‘x’和‘X’的地址

●试题二阅读下列说明、流程图和算法,将应填入(n)处的字句写在答题纸的对应栏内。【说明】下面的流程图(如图3所示)用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:【流程图】图3流程图【算法说明】将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数int p(int A[],int low,int high)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数void sort(int A[],int L,int H)的功能是实现数组A中元素的递增排序。【算法】void sort (int A[], int 1,int H){if ( LH){k=p(A,L,R);//p()返回基准数在数组A中的下标sort( (4) );//小于基准数的元素排序sort( (5) );//大于基准数的元素排序}}

struct w{ char low;char high;};union u{ struct w byte;short word;}uw;main( ){ int result;uw.word=0x1234;printf(“word value:%04x\n”,uw.word);printf(“high byte:%02x\n”,uw.byte.high);printf(“low byte:%02x\n”,uw.byte.low);uw.byte.low=0x74;printf(“word value:%04x\n”,uw.word);result=uw.word+0x2a34;printf(“the result:%04x\n”,result);}

阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】下面的程序利用快速排序中划分的思想在整数序列中找出第 k 小的元素(即 将元素从小到大排序后,取第 k 个元素)。对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数 作为基准值,然后根据基准值进行划分,从而将待排序的序列划分为不大于基准 值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和 右子序列分别进行快速排序,最终得到非递减的有序序列。例如,整数序列“19, 12, 30, 11,7,53, 78, 25"的第 3 小元素为 12。整数序列“19, 12,7,30, 11, 11,7,53. 78, 25, 7"的第 3 小元素为 7。函数 partition(int a[], int low,int high)以 a[low]的值为基准,对 a[low]、 a[low+l]、…、a[high]进行划分,最后将该基准值放入 a[i] (low≤i≤high),并 使得 a[low]、a[low+l]、,..、A[i-1]都小于或等于 a[i],而 a[i+l]、a[i+2]、..、 a[high]都大于 a[i]。函 教 findkthElem(int a[],int startIdx,int endIdx,inr k) 在 a[startIdx] 、 a[startIdx+1]、...、a[endIdx]中找出第 k 小的元素。【代码】#include #include Int partition(int a [],int low, int high){//对 a[low..high]进行划分,使得 a[low..i]中的元素都不大于 a[i+1..high]中的 元素。int pivot=a[low]; //pivot 表示基准元素 Int i=low,j=high;while(( 1) ){While(ipivot)--j; a[i]=a[ j] While(ipivot)++i; a[ j]=a[i]}(2) ; //基准元素定位 return i;}Int findkthElem(int a[],int startIdx,int endIdx, int k){//整数序列存储在 a[startldx..endldx]中,查找并返回第 k 小的元素。if (startldxendIdx || kendIdx||k-1 if (loc==k-1) ∥找到第 k 小的元素return (3) ;if(k-l 小的元素}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

数据结构与算法里,折半查找中,low指向低端的记录,high指向高端的记录,每次计算中间位置mid的公式是()。A、(lowhigh)/2B、(low+high)/2C、(low-high)/2D、low/2+high/2

数字口可以输出(),可以输入()。A、0(LOW)或1(HIGH);0-1023B、0(LOW)或1(HIGH);0.1023C、0(LOW)或1(HIGH);0或1D、0(LOW)或1(HIGH);0

完成下列折半插入排序算法。 Void binasort(struct node r[MAXSIZE],int n) {for(i=2;i=n;i++){ r[0]=r[i];low=1;high=i-1; while(low=high){ mid=(low+high)/2; if(r[0].key else low=mid+1 ; } for(j=i-1;j=low;j- -)r[j+1]=r[j] ; r[low]=() ; } }

Pipelines are not ()A、labor-intensiveB、capital-intensiveC、tech-intensiveD、low cost and high return

升降舵有几个马达?A、每边有一个B、每边有两个,左边有两个HIGH马达,右边两个LOW马达。C、每边有两个,左边两个LOW马达,右边两个HIGH马达。D、每边有两个,每边有一个HIGH马达和一个LOW马达。

单选题数据结构与算法里,折半查找中,low指向低端的记录,high指向高端的记录,每次计算中间位置mid的公式是()。A(lowhigh)/2B(low+high)/2C(low-high)/2Dlow/2+high/2

单选题A non-return valve in the air delivery line near to the compressor must be ()type similar to the compressor discharge valve.Athe low inertiaBthe high inertiaCthe low velocityDthe high velocity

单选题The direction of the surface wind is().Adirectly from high pressure toward low pressureBdirectly from low pressure toward high pressureCfrom high pressure toward low pressure deflected by the earth's rotationDfrom low pressure toward high pressure deflected by the earth's rotation

单选题A tide is called diurnal when().Aonly one high and one low water occur during a lunar dayBthe high tide is higher and the low tide is lower than usualCthe high tide and low tide are exactly six hours apartDtwo high tides occur during a lunar day

单选题Operational amplifiers, used primarily in analog circuits, are characterized by()Ahigh input impedance, high gain and low output impedanceBhigh input impedance, high gain and high output impedanceClow input impedance, low gain and high output impedanceDlow input impedance, high gain and low output impedance

填空题完成下列折半插入排序算法。 Void binasort(struct node r[MAXSIZE],int n) {for(i=2;i else low=mid+1 ; } for(j=i-1;j=low;j- -)r[j+1]=r[j] ; r[low]=() ; } }