算法思想:
顺序存储的线性表递增有序,可以顺序查找,也可以折半查找。题目要求“用最少的时间在表中查找数值为x的元素”,这里应使用折半查找法。
本题代码如下:
//C语言版本
#include<iostream>
using namespace std;
typedef int ElemType;
void SearchExchangeInsert(ElemType A[],ElemType x,int n) {
int low=0,high=n-1,mid; //low和high指向顺序表下界和上界的下标
while(low<=high) {
mid=(low+high)/2; //找中间位置
if(A[mid]==x) break; //找到x
else if(A[mid]<x) low=mid+1; //到中点mid的右半部去查
else high=mid-1; //到中点mid的左半部去查
} //下面两个if语句只会执行一个
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
int i;
for(i=n-1;i>high;i--) A[i+1]=A[i]; //后移元素
A[i+1]=x; //插入X
} //插入结束
}
int main(){
int A[10]={1,2,3,4,5,6,7,8,9,10};
printf("原顺序表:");
for(int m=0;m<10;m++){
printf("%5d",A[m]);
}
printf("\r\n");
SearchExchangeInsert(A,5,10);
printf("现顺序表:");
for(int m=0;m<10;m++){
printf("%5d",A[m]);
}
}