【问题描述】线性表{a1,a2,...,an}中元素递增有序且按顺序存储于计算机内,要求设计一个算法完成以下功能:
(1)用最少的时间在表中查找到值为x的元素;
(2)若找到将其与后继元素位置相交换;
(3)若找不到将其插入表中并保持原表的有序性。
【输入形式】n a1 a2 ... an (说明:先输入线性表的长度n,之后输入n 个整数,数值递增有序,数值之间以空格分隔)
x(说明:输入被查元素x)
【输出形式】如果x找到,与后继元素交换后显示线性表,显示结果以空格作为分隔;
如果x找不到,插入到线性表中合适的位置并显示线性表,显示结果以空格作为分隔。
【样例输入】5 1 2 3 4 5
2
【样例输出】1 3 2 4 5
【样例输入】5 1 2 4 5 6
3
【样例输出】1 2 3 4 5 6
查找可以用二分法
#include <stdio.h>
typedef struct _sqlist
{
int data[1000];
int len;
}sqlist;
void insert(sqlist *sq,int m)
{
int i=0;
for(i=0;i<sq->len;i++)
{
if(m < sq->data[i])
{
for(int j=sq->len;j>i;j--)
sq->data[j] = sq->data[j-1];
sq->data[i] = m;
break;
}
}
if(i==sq->len)
sq->data[sq->len] = m;
sq->len++;
}
int search(sqlist *sq,int m)
{
int start = 0,end = sq->len-1;
while(start <= end)
{
int mid = (start+end)/2;
if(sq->data[mid] == m)
return mid;
if(sq->data[mid] < m)
start = mid + 1;
else
end = mid - 1;
}
return -1;
}
int main()
{
sqlist sq;
scanf("%d",&sq.len);
for(int i=0;i<sq.len;i++)
scanf("%d",&sq.data[i]);
int x;
scanf("%d",&x);
int idx = search(&sq,x);
if(idx >= 0)
{
if(idx < sq.len-1)
{
int t = sq.data[idx];
sq.data[idx] = sq.data[idx+1];
sq.data[idx+1] = t;
}
}
else
insert(&sq,x);
for(int i=0;i<sq.len;i++)
printf("%d ",sq.data[i]);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!