阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。

练习题库2022-08-02  41

问题 阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。【说明】直接插入排序是一种简单的排序方法,具体做法是:在插入第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<data[i-1]){   //将data插入有序子序列data[0]~data[i-1]              tmp=data;             //备份待插入的元素              data=(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;阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。【说明】直接插入排序是一种简单的排序方法,具体做法是:在插入第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<data[i-1]){   //将data插入有序子序列data[0]~data[i-1]              tmp=data;             //备份待插入的元素              data=(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;}

选项

答案

解析 (1)data[i-1](2)data[j+1]=data[j](3)data[j+1](4)arr(5)*bp
【解析】

直接插入排序法是将关键码插入已经排好的序列中,因此将data插入序列data[0]~data[i-1]中,此时序列data[0]~data[i-1]已经按照升序排列好,而data应插入位置前的数据应该比data小,而插入位置后的数据应比data大,在if语句中判断data<data[i-1]中可以看出,在进行插入运算时,是从序列data[0]~data[i-1]最后一个数据data[i-1]向前逐一进行比较,若data>=data[i-1],则将data插入到d[i-1]后;若data<data[i-1],data需要与data[i-2]进行比较,如此依次进行,此时需要将data备份并将data[i-1]后移,即temp=data; data=data[i-1];之后是进行比较,即for(j=i-2;j>=0&&data[j]>tmp;j--)循环,从data[i-2]开始向前逐一比较,即j从i-2开始向0循环,若data[j]>tmp,则进行for循环,此时需要将data[j]即data[i-2]的值后移,使得data[i-1]=data[i-2],即data[j+1]=data[j],然后j--,用tmp与data[j]进行比较,如果tmp< data[j],则说明tmp应放在data[j]之前,那么data[j]需要继续往后移动。所以data[j+1]= data[j]。    当该循环结束时,此时有2种情况:(1)j=-1<0,此时data[0]>tmp;应使得data[0]后移,即data[1]=data[0],data[0]=tmp,因此第3空填写data[j+1];(2)data[j]<=tmp;此时需要将tmp插入到data[j]后,即data[j+1]=tmp。    在main函数中调用insertSort函数并输出数组元素,在for(; bp<ep;bp++)中循环变量是bp,因此输出的是bp指向的数组元素,即调用insertSort函数后返回的数组arr,因此bp=arr(bp是指针变量,数组名arr可以直接将数组地址传递给bp);在printf函数中输出bp;因此printf(“%d\n”,*bp)。
转载请注明原文地址:https://www.tihaiku.com/congyezige/2424926.html

最新回复(0)