#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
/*
* 线性表中所有元素递增有序且是顺序表,设计一个算法,用最少的时间在表中查找值为x的元素,若找到
* 则其与后继元素交换,若找不到,则将其插入表中并使表中元素仍然递增有序。
*/
int findx(int* arr, int x,int start,int end)
{
int i = start;
int j = end;
int k = 0;
while (i <= j) //二分查找
{
if (x == arr[(i + j) / 2])
return (i + j) / 2;
else if (x >= arr[(i + j) / 2])
i = (i + j) / 2;
else
j = (i + j) / 2;
k += 1;
if(k>end) //防止没有找到元素产生的死循环
return -1;
}
}
void Exchange(int* arr, int k)
{
int tmp = 0;
tmp = arr[k];
arr[k]=arr[k + 1];
arr[k + 1] = tmp;
printf("查找成功,交换后的顺序表为:");
for (int i = 0; i < 8; i++)
printf("%2d", arr[i]);
}
void Insert(int* arr, int x)
{
for (int i = 7; i>0; i--)
{
if (arr[i] > x)
arr[i + 1] = arr[i];
else
{
arr[i+1] = x;
break;
}
}
printf("插入后的序列为:");
for (int i = 0; i < 9; i++)
{
printf("%4d", arr[i]);
}
}
int main()
{
int arr[10] = { 1,2,3,4,6,7,8,9 };
int x;
printf("请输入要查找的值:");
scanf("%d", &x);
int r=findx(arr, x,0,7);
if (r > 0) //r>0,证明找到,则交换
Exchange(arr, r);
else //否则,则插入
Insert(arr,x);
return 0;
}