线性表(a1,a2,...,an)中元素递增有序且按顺序存储于计算机内的数组a中。要求设计一算法用函数实现下列功能:
(1) 用最少时间在表中查找值为x的元素;
(2) 若找到则将其于直接后续元素交换;
(3) 若找不到则将其插入表中使其表中元素仍然递增有序
//使用折半查找法 void SearchExchangeInsert(ElemType A[],ElemType x) { int low = 0,high = n-1, 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) { t = A[mid]; A[mid] = A[mid + 1]; A[mid + 1] = t; } if (low > high) { for (int i = n-1; i > high; i--) A[i + 1] = A[i]; A[i + 1] = x; } }
顺序存储的线性表递增有序,可以顺序查找也可以折半查找,题目要求“最少时间查找值为x的元素”,选用折半查找
算法如下:
#define status int #define true 1 #define false 0 status SearchExchangeInsert(ElemType a[],int *n,ElemType x) { int low=0,high=*n-1,mid,i; status s=false; //数组长度检查 if(low>high) return s; if(*n<=0) return s; //折半查找 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(low<=high) { //是否最后一个元素 s=true; if(mid==*n-1) return s; //不是最后一个元素,则与后继交换 a[mid]=a[mid+1]; a[mid+1]=x; } else //查找失败 { for(i=*n-1;i>=low;i--) a[i+1]=a[i]; a[low]=x; (*n)++; } return s; }