/*43. (15 分)已知由η (n≥2)个正整数构成的集合A= {ax}0≤k<n},将其划分为两个
不相交的子集A1和A2,元素个数分别是n1和n2,A1和A2中元素之和分别为S1和S2。设
计一个尽可能高效的划分算法,满足|n1-n2|最小且|S1-S2|最大。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C+ +语言描述算法,关键之处给出注释。
(3)说明你所设计算法的平均时间复杂度和空间复杂度。
*/
#include <stdio.h>
//参照快速排序的思想
int setPartition(int *a,int len){
int high=len-1;
int low=0;
int pivot=0;
int high0=high;//保存上次low和high的位置
int low0=low;
while(true){
pivot=a[low];
while(low<high){
while (a[high]>=pivot&&low<high){
high--;
}
a[low]=a[high];
while (a[low]<=pivot&&low<high){
low++;
}
a[high]=a[low];
}
a[low]=pivot;
if (low==len/2-1){
break;
}
//A1部分元素少于A2部分,则取前半部分继续划分
if(low<len/2-1){
low++;
low0=low;
high=high0;
}else{//取后半部分继续划分
high--;
high0=high;
low=low0;
}
}
int S1=0;
for (int i = 0; i < len/2; ++i) {
S1+=a[i];
}
int S2=0;
for (int i = len/2; i < len; ++i) {
S2+=a[i];
}
int differences=S2-S1;
return differences;
}
int main() {
int A[10]={4,1,12,18,7,13,18,16,5,15};
int defference=setPartition(A,sizeof A/sizeof A[0]);
for (int i = 0; i < sizeof A/sizeof A[0]; ++i) {
printf("%d ",A[i]);
}
printf("\ndifferences=%d",defference);
return 0;
}
408 2016 43
最新推荐文章于 2024-07-25 12:55:52 发布