面试宝典中87页中面试例三,不再叙述原题。大意即是有两个数组a和b,两个数组的元素相同,但是顺序不同,写一个算法求出数组a和数组b中元素之间的对应关系。题意要求不能对同一个数组中的两个元素进行比较,也不能去取数组元素中的特定值进行比较。只能进行a和b元素之间的比较。
利用双重循环的时间复杂度为O(n^2),根据书中提示的优化方法定义一下数据结构
利用快排的思想和二分查找的思想对数组进行比较。利用a[0]初始化数组c,其中数组前半部分表示b[j]<a[0],后面部分表示b[j]>a[0].同时记录k,使得b[k]==a[0],以后对a数组进行比较时均与b[k]进行比较,(因为不让同数组之间进 行比较).
#include<iostream>
#include <time.h>
using namespace std;
typedef struct {
int loc_b;
int flag;//-1,0,1分别表示b[loc_b]<,=,>a[loc_a]
int loc_a;
}C;
const int N=10;
C c[N];
int a[N];
int b[N];
void match()
{
int i,j,head,tail,k;
head =0;
tail =N-1;
srand(time(NULL)); //随机数
i=rand()%N;
//初始化赋值 类似与按照a[i]的值对b进行快排
for(j=0;j<N;j++)
{
if(b[j]<a[i]) //从前向后插入到c
{
c[head].loc_b= j;
c[head].flag = -1;
c[head].loc_a=i;
head++;
}
else if(b[j]>a[i]) //从后向前插入到c
{
c[tail].loc_b= j;
c[tail].flag = 1;
c[tail].loc_a=i;
tail--;
}
else
k=j; //记录相等时候的位置
}
c[head].loc_b= k;
c[head].flag = 0;
c[head].loc_a=i;
for(i=0;i<N;i++)
{
if(a[i]<b[k]) //a[i]小于b[k]时候,从c的前面进行比较
{
for(j=0;j<head;j++)
{
if(a[i]==b[c[j].loc_b])
{
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(a[i]==b[c[j].loc_b])
{
c[j].flag = 0;
c[j].loc_b= 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;
}