您的位置:首页 > 其它

两个数组元素相同,顺序不同,进行正确匹配

2015-04-02 10:30 3043 查看
面试宝典中87页中面试例三,不再叙述原题。大意即是有两个数组a和b,两个数组的元素相同,但是顺序不同,写一个算法求出数组a和数组b中元素之间的对应关系。题意要求不能对同一个数组中的两个元素进行比较,也不能去取数组元素中的特定值进行比较。只能进行a和b元素之间的比较。

利用双重循环的时间复杂度为O(n^2),根据书中提示的优化方法定义一下数据结构

typedef struct {

int loc_b;

int flag;//-1,0,1分别表示b[loc_b]<,=,>a[loc_a]

int loc_a;

}C;

数组定义如下

C c
;

int a
;

int b
;

利用快排的思想和二分查找的思想对数组进行比较。利用a[0]初始化数组c,其中数组前半部分表示b[j]<a[0],后面部分表示b[j]>a[0].同时记录k,使得b[k]==a[0],以后对a数组进行比较时均与b[k]进行比较,(因为不让同数组之间进行比较).

void _match(){

int head=0;

int tail=N-1;

int i,j,k;

i=rand()%N;

//初始化赋值

for(j=0;j<N;j++){//类似与按照a[i]的值对b进行快排

if(b[j]>a[i]){//从后向前插入到c

c[tail].flag=1;

c[tail].loc_a=i;

c[tail].loc_b=j;

tail--;

continue;

}

if(b[j]<a[i]){//从前向后插入到c

c[head].flag=-1;

c[head].loc_a=i;

c[head].loc_b=j;

head++;

continue;

}

if(b[j]==a[i]){

k=j;//记录相等时候的位置

}

}

c[head].flag=0;

c[head].loc_a=i;

c[head].loc_b=k;

//endfor

for(i=0;i<N;i++){

if(a[i]<b[k]){//a[i]小于b[k]时候,从c的前面进行比较

for(j=0;j<head;j++){

if(b[c[j].loc_b]==a[i]){

c[j].flag=0;

c[j].loc_a=i;

break;

}

}

}else if(a[i]>b[k]){//从c的后面比较

for(j=head+1;j<N;j++){

if(b[c[j].loc_b]==a[i]){

c[j].flag=0;

c[j].loc_a=i;

break;

}

}

}

}

}

进行测试

int main(){

int i=0;

for(i=0;i<N;i++){

a[i]=i;

b[i]=N-i-1;

}

_match();

for(i=0;i<N;i++){

cout<<"b["<<c[i].loc_b<<"] match a["<<c[i].loc_a<<"]"<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐