目录
point
如果顺序表有序,二分查找最快。
此题的时间复杂度为O(n)
空间复杂度为O(1)
代码
/**
* 用顺序表实现 王道P18 T9
* point:如果顺序表有序,二分查找最快!!!
* ①算法思想:
* 使用二分查找法若成功找到值为x的元素,则其下标为mid,与下标为mid + 1的元素交换位置;
* 若二分查找失败,则将x插到下标为low的位置(或者是high + 1的位置)
*
* ②数据结构:
* typedef struct{
* int data[MaxSize];
* int length;
* }SqList;
*
* ③算法设计
*/
#include <stdio.h>
#define MaxSize 100
typedef struct{
int data[MaxSize];
int length;
}SqList;
void FindXi(SqList &L,int x){
int low = 0,high = L.length - 1,mid;
while(low <= high){
mid = (low + high) / 2;
if(L.data[mid] == x)
break;
else if(L.data[mid] > x)
high = mid - 1;
else
low = mid + 1;
}//二分查找结束
//如果是查找成功的情况
if(low <= high){
//和后继元素交换前要先判断mid后面还没有元素,即判断mid位置的元素是不是最后一个元素,若不是则与后继元素交换
if(mid != L.length - 1){
int t = L.data[mid];
L.data[mid] = L.data[mid + 1];
L.data[mid + 1] = t;
}
}
//如果是查找失败的情况
else{
for (int i = L.length - 1; i >= low; i--) {
L.data[i + 1] = L.data[i];
}
L.data[low] = x;
L.length++;
}
}
//以下用于测试
void InitList(SqList &L){
for (int i = 0; i < MaxSize; ++i) {
L.data[i] = 0;
}
L.length = 0;
}
void PrintList(SqList L){
for (int i = 0; i < L.length; ++i) {
printf("%d ",L.data[i]);
}
printf("\n");
}
int main(){
SqList L = {{1,2,4,5,6}, 5};
PrintList(L);
FindXi(L,3);
PrintList(L);
return 0;
}