文章

164

粉丝

0

获赞

1

访问

93.0k

头像
2016年(408)计算机学科专业基础综合试题 - 第43题回答
数据结构
发布于2025年11月18日 16:31
阅读数 345

(1)即保证A1与A2个数尽可能相同,且A2尽可能大,A1尽可能小,故让后方序列中均为较大的数,前方序列为较小的数,为保证个数相同,借助快速排序中的分治思想,通过寻找中间元素的位置,将原数组拆分成两个序列,仅需进行一次分治处理,此时前后序列即为所求。

(2)

初始化数组a[n];

int mid=n/2;//中间元素作为基准

int low=0;int high=n-1;

int partion(int a[];int low;int high)//执行划分操作

{

while(low<high)

{

int pivot=a[low];

while(low<high&&a[high}>=pivot)high--;

a[low]=a[high];

while(low<high&&a[low]<=pivot)high++;

a[high]=a[low];

}

a[low]=pivot;

return low;

}

int QuickSelect(int a[n],int low,int high)

{

int judge=partion(a[n],low,high);

if(judge=mid) return 0;//找到mid时,说明数组中间元素以成功找到,此时序列划分完毕,停止划分

else

{

QuickSelect(a[n],low,judge-1);

QuickSelect(a[n],judge+1,high);

}

}

(3)时间复杂度为o(nlogn),空间复杂度为o(n)


评分及理由

(1)得分及理由(满分4分)

得分:3分

理由:学生基本理解了问题的核心思想,即通过寻找中间元素来划分两个子集,使得元素个数差最小且和差最大。提到了使用快速排序的分治思想,但没有明确指出只需要划分到找到第⌊n/2⌋小的元素为止,而是提到了"进行一次分治处理",表述不够精确。基本设计思想正确但不够完整。

(2)得分及理由(满分9分)

得分:4分

理由:代码存在多处问题:
1. 函数声明语法错误(使用了分号而非逗号分隔参数)
2. 在第二个...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发