题目:线性表中的元素递增有序存储,设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,则将其与后继元素位置相交换,若找不到,则将其插入表中使其有序。
思路:分成两个函数,一个查找,另外一个插入
代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define InitSize 5
typedef struct {
int* data;
int length;
int MaxSize;
}SeqList;
bool InitList(SeqList* L) {
L->data = (int*)malloc(sizeof(int) * InitSize);
L->length = 0;
L->MaxSize = InitSize;
return true;
}
int Qury(SeqList* L, int x) {
int left = 0, right = L->length - 1;
while (left<=right) {
int mid = left + ((right - left) / 2); //防止溢出,等价于(left+right)/2
if (L->data[mid] > x)
right = mid - 1;
else if (L->data[mid] < x)
left = mid + 1;
else
return mid;
}
return -1;
}
bool Insert(SeqList* L, int e,int x) {
if (e == -1) {
for(int i=0;i<L->length;i++)
if (x < L->data[i]) {
for (int j = L->length - 1; j >= i; j--) {
L->data[j + 1] = L->data[j];
}
L->data[i] = x;
L->length++;
return true;
}
}
else {
int temp = L->data[e];
L->data[e] = L->data[e + 1];
L->data[e + 1] = temp;
}
return true;
}
int main()
{
SeqList L;
InitList(&L);
for (int i = 0; i < L.MaxSize-1; i++) {
scanf("%d", &L.data[i]);
L.length++;
}
int x;
printf("请输入要查找的值:\n");
scanf("%d", &x);
int e = Qury(&L, x);
if (Insert(&L, e, x)) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
return 0;
}