线性表(a1,a2,a3,…,an)中元素递增有序且按顺序存储与计算机内。要求设计一算法完成:
- 用最少时间在表中查找数值为x的元素;
- 若找不到,则将其插入表中并使表中元素仍然递增有序。
解析:有序且顺序存储,特点很明显,用折半查找,折半插入
#define SIZE 20
typedef struct{
int data[SIZE+1]; //0号位置留空,确保下标和位置一致
int length;
}Sqlist;
int find(Sqlist *list, int e){
int mid,low,high;
low = 1, high = list->length;
//查找部分
while(low <= high){
mid = (low + high) / 2;
if(list->data[mid] == e) //如果查找到,直接返回位置
return mid; //查找到的位置
else if(list->data[mid] > e)
high = mid - 1;
else low = mid + 1;
}
//没有查找到才会执行以下操作
//此时 low == high
//插入部分
for(int m = list->length; m > high; m--)
list->data[m+1] = list->data[m];
list->data[high+1] = e;
list->length++;
printf("重新插入成功!");
return high; //插入后的位置
}