信管网每日一练
软件设计师 - 每日一练 导航

软件设计师案例分析每日一练试题(2025/12/7)

2025年12月08日来源:信管网 作者:cnitpm

软件设计师案例分析当天每日一练试题地址:www.cnitpm.com/exam/ExamDayAL.aspx?t1=4

往期软件设计师每日一练试题汇总:www.cnitpm.com/class/27/e4_1.html

软件设计师案例分析每日一练试题(2025/12/7)在线测试:www.cnitpm.com/exam/ExamDayAL.aspx?t1=4&day=2025/12/7

点击查看:更多软件设计师习题与指导

软件设计师案例分析每日一练试题内容(2025/12/7)

【说明】
希尔排序算法又称最小增量排序算法,其基本思想是:
步骤1 :构造一个步长序列delta1、delta2...、deltak ,其中delta1=n/2 ,后面的每个delta是前一个的1/2 , deltak=1;
步骤2 :根据步长序列、进行k趟排序;
步骤3 :对第i趟排序,根据对应的步长delta,将等步长位置元素分组,对同一组内元素在原位置上进行直接插入排序。
【C代码】
下面是算法的C语言实现。
(1)常量和变量说明
data:待排序数组data,长度为n,待排序数据记录在data[0]、data[1]、...、data[n-1]中。
n:数组a中的元素个数。
delta:步长数组。
(2)C程序
#include
void shellsort(int data[ ], int n){
int *delta,k,i,t,dk,j;
k=n;
delta=(int *)nalloc(sizeof(int)*(n/2));
if(i=0)
do{
( 1 ) ;
delta[i++]=k;
}while ( 2 ) ;
i=0;
while((dk=delta[i])>0){
for(k=delta[i];kif( ( 3 ) ) {
t=data[k];
for(j=k-dk;j>=0&&tdata[j+dk]=data[j];
}/*for*/
( 4 ) ; //data[j+dk]=t;
}/*if*/
++i;
}/*while*/
}

【问题1】(8分)
根据说明和c代码,填充c代码中的空(1) ~ (4)。
【问题2】(4分)
根据说明和c代码,该算法的时间复杂度(5)O(n2) (小于、等于或大于)。该算法是否稳定(6) ( 是或否)。
【问题3】(3分)
对数组(15、9、7、8、20、-1、 4)用希尔排序方法进行排序,经过di-趟排后得到的数组为(7)。
信管网试题答案与解析:www.cnitpm.com/exam/ExamDayAL.aspx?t1=4&day=2025/12/7

信管网考友试题答案分享:

信管网1768*******:
//打印数组 void printarray(int arr[], int size) {..} void shellsort(int data[ ], int n){ if (n <= 1) return; int *delta; int dk; //步长 int i=0,j,k=n; int t; //临时存放 delta = (int *)malloc(sizeof(int) * (n / 2 + 1)); do{ k = k/2; delta[i++]=k; }while( k>1 ); i=0; while((dk=delta[i])>0){ for (k = dk; k < n; k++) { if( data[k]){ t = data[k]; for( j=k-dk; j>=0 && data[j]>t; j -=dk){ data[j + dk] = data[j] ; } data[j+dk] = t; } } printf("第 %d趟 ,步长为%d 的时候,排完的数组为:", i+1, dk); printarray(data,n); ++i; } }

信管网1768*******:
void shellsort(int data[ ], int n){ if (n <= 1) return; // 如果数组长度小于等于1,无需排序 int *delta; int dk; //步长 int i=0,j,k=n; int t; //临时存放 // 分配 delta 数组,大小为 n/2 + 1 以确保足够的空间 delta = (int *)malloc(sizeof(int) * (n / 2 + 1)); // 把 步长 存起来 do{ //(1); k = k/2; delta[i++]=k; }while( k>1 ); //(2) // 当n=8时,delta=[4,2,1] delta[i] = 0; // 终止标志 printf("delta:"); printarray(delta,i); i=0; // 使用生成的步长序列进行希尔排序 while((dk=delta[i])>0){ // 对每个步长 dk 进行插入排序 for (k = dk; k < n; k++) { //(3) if( data[k]){ t = data[k]; // for( j=k-dk; j>=0 && data[j]>t; j -=dk){ data[j + dk] = data[j] ; } data[j+dk] = t; //(4) } } printf("%d 的步长时:", dk); printarray(data,n); ++i; }/*while*/ }

信管网cnit**************:
<br /><img src="http://pic.cnitpm.com/upload/2023/02/tbimg/02-26/1677397109.jpg" />

信管网cnit**************:
<br /><img src="http://pic.cnitpm.com/upload/2022/11/tbimg/11-02/1667342311.jpg" />

信管网cnit**************:
1. k = k/2 k >= 1 data[j + dk] >= data[j] data[j+dk]=t 2, 大于 否

信管网试题答案与解析:www.cnitpm.com/exam/ExamDayAL.aspx?t1=4&day=2025/12/7

温馨提示:因考试政策、内容不断变化与调整,信管网提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准!

分享至:

信管网 - 信息系统项目管理专业网站

下载APP-在线学习