1线性表(a1,a2,a3,a4.....,an)中的元素递增有序且顺序存储于计算机内。要求设计一个算法完成,用最少时间在表中查找数值为X的元素,若找到则将与其与后继元素位置相交换,若找不到,则将其插入表中,并使表中元素仍递增有序。
void SearchExchangeInsert( ElemType[],ElemType x){
int low=0;
int high=n-1;
int mid;
while(low<=high){//照应题目中递增 有序 顺序 存储 采用折半查找
mid=(low+high)/2;
if(A[mid]==x){
break;
}
else{
if(A[mid]<x){
low=mid+1;
}
else{
high=mid-1;
}
}
}
if(A[mid]==x&&mid!=n-1){//若最后一个元素与x相等,则不存在与其后继交换的操作
int t=A[mid];
A[mid]=A[mid+1];
A[mid+1]=t;
}
if(low>high){ //查找失败,插入数据元素x
for(i=n-1;i>high;i--){
A[i+1]=A[i];
A[i+1]=x;
}
}
}
2设将 n个整数存放到一维数组中,设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(0<P<n)个位置即将R中保存的数据由(X0,X1,......Xn-1)变换为(Xp,Xp+1.......Xn-1,X0,X1.....Xp-1)。给出算法的基本设计思想,根据思想写出算法。说明所设计算法的时间复杂度和空间复杂度。
设计思想:进行了3次逆置,第一次是在0到p-1(下标)之间 举例子
1 2 3 4 5(n=4,p=5)最终结果应为(5 1 2 3 4)第一次翻转是在(1 2 3 4)翻转成为4 3 2 1
第二次翻转对5进行翻转,经过两次翻转数组变为( 4 3 2 1 5),第3次翻转对整个数组进行翻转
(5 1 2 3 4)
void Reverse(int R[],int from,int to){
int i,temp;
for(i=0;)
for(i=0;i<(to-from+1)/2;i++){
{
temp=R[from+i];
R[from+i]=R[to-i];
R[to-i]=temp;
}
}
}
void Converse(int R[],int n,int p){
Reverse(R,0,p-1);
Reverse(R,p,n-1);
Reverse(R,0,n-1);
}