线性表(a1,a2,a3,…,an)中的元素递增有序且按顺序存储于计算机内。
要求设计一算法,完成用最少时间在表中查找数值为x的元素,若找到则将其与后继元素位置相交换,若找不到则将其插入表中并使表中元素仍然递增有序
核心代码:
//线性表(a1,a2,a3,...,an)中的元素递增有序且按顺序存储于计算机内。
//要求设计一算法,完成用最少时间在表中查找数值为x的元素,若找到则将其与后继元素位置相交换
//若找不到则将其插入表中并使表中元素仍然递增有序
#include <iostream>
#define ElemType int
#define InitSize 50
using namespace std;
typedef struct {
ElemType *data;
int MaxSize,length;
}SeqList;
void printList(SeqList L)
{
cout<<"表为:";
for (int i = 0; i < L.length; i++)
cout << L.data[i] << " ";
cout << endl;
}
void Init(SeqList &L)
{
L.data = new ElemType[InitSize]; //C++的初始动态分配语句
if (!L.data){ cout << "存储空间申请失败!"; return; }
L.length = 0;
L.MaxSize = InitSize;
}
void SearchExchangeInsert(ElemType A[],int &n,ElemType x)
{
int t,i;
int low=0,high=n-1,mid;
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(A[mid]==x && mid!=n-1) //若最后一个元素与x相等,则不存在与其后继元素交换的操作
{ 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; n++; //插入X ,长度加一
}
}
int main(){
SeqList a; Init(a);
int i,x,n;
cout<<"请输入a表长:"; cin>>a.length;
cout<<"输入表中元素:";
for ( i = 0; i < a.length; i++) cin >> a.data[i];
printList(a);
cout<<"输入要查找的数X:"; cin>>x;
ElemType A[50];
for( n = 0; n < a.length; n++) A[n]=a.data[n];
cout<<"初始为:";
for(i=0;i<a.length;i++) cout<<A[i]<< "\t";
cout<<endl;
SearchExchangeInsert(A,n,x);
cout<<"结果为:";
for(i=0;i<n;i++) cout<<A[i]<< "\t";
cout<<endl;
return 0;
}
测试样例: