算法第二章作业

1、
void swap(int a,int b){
int t = a;
a = b;
b = t;
}

int beforechoose(int a[],int left,int right){
int p = a[right];
int i = left - 1;
for(int j=left;j<right;j++){
if(a[j]<=p){
i++;
swap(a[i],a[j]);
}
}
swap(a[i+1],a[right]);
return i+1;
}

int findk(int a[],int left,int right,int k){
if(left == right) return a[left];
if(left < right){
int p = beforechoose(a,left,right);
if(p - left + 1 == k){
return a[p];
}else if(p - left + 1 > k){
return findk(a,left,p - 1,k);
}else{
return findk(a,p + 1,right,k - (p - left + 1));
}
}
return -1;
}

2、最好:O(n)
最坏:O(n2)

3、分治法让我了解了如何将复杂问题化为简单问题逐个击破。它将大问题拆解为相互独立的子问题,递归求解后再合并结果。这种思想让我明白,面对复杂任务时,合理的分解策略至关重要。好的划分能大幅提升效率,而拙劣的划分反而会增加负担。这不仅是算法设计的精髓,更是解决实际问题的通用方法论。

posted @ 2025-10-20 16:41  登基了但是不想上早朝  阅读(3)  评论(0)    收藏  举报