1问题描述
问题描述:线性表(a1,a2,a3,…,an)中的元素递增有序且按顺序存储于计算机中。设计一算法,完成用最少时间在表中查找数值为x的元素,若找到则将其与后继元素想交换,若找不到则将其插入表中并使表中元素仍旧有序。
2核心代码
二分模板
while (l < r)//形式二:开始二分查找(自己习惯的)此处 l<r,则不存在该元素判断语句为l>=r
{
mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid + 1;
}
void LocateElem(SeqList &L,int e)
{
int l = 0,r = L.length - 1,mid;
/*while (l <= r)//开始二分查找(书上的)此处 l<=r,则不存在该元素判断语句为l>r
{
mid = (l + r)/2;
if (L.data[mid] == e) break;
else if (e < L.data[mid]) r = mid-1;
else l = mid + 1;
}
*/
while (l < r)//形式二:开始二分查找(自己习惯的)此处 l<r,则不存在该元素判断语句为l>=r
{
mid = (l + r) / 2;
if (L.data[mid] == e) break;
else if (e < L.data[mid]) r = mid;
else l = mid + 1;
}
if (L.data[mid] == e && mid != L.length-1)
{
int temp = L.data[mid];
L.data[mid] = L.data[mid + 1];
L.data[mid + 1] = temp;
}
if (l >= r)//进行插入操作 插入下标点是 mid
{
ListInsert(L, mid + 1, e);
/* for (int j = L.length; j > mid; j--) //这里的mid是待插入数组的下标
{
L.data[j] = L.data[j - 1];
}
L.data[mid] = e;
L.length++;
*/}
}
3完整代码
#include<iostream>
#include<algorithm>
#define InitSize 12
typedef struct //结构
{
int *data;
int length;
int MaxSize;
}SeqList;
void InitList(SeqList &L) //初始化
{
// L.data = new int[InitSize];
L.data = (int *)malloc(InitSize * sizeof(int));
L.length = 0;
L.MaxSize = InitSize;
}
bool ListInsert(SeqList &L, int i, int e)
{
if (i < 1 || i > L.length + 1) return false;
if (L.length >= L.MaxSize) return false; //如果刚好相等没办法插入
for (int j = L.length; j >= i; j--) //当前长度的后一位开始j = L.length
{
L.data[j] = L.data[j - 1]; //最后一个相当于L.data[i] = L.data[i - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
bool ListDelete(SeqList &L, int i, int &e)
{
if (i < 1 || i > L.length) return false;
e = L.data[i - 1];
for (int j = L.length; j >= i; j--)
{
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
/*
int Bsearch_2(SeqList &L,int &l, int &r,int e)
{
int mid = (l + r) >> 1;
while (l < r)
{
if (e < L.data[mid]) r = mid;
else l = mid + 1;
}
return l;
}
*/
void LocateElem(SeqList &L,int e)
{
int l = 0,r = L.length - 1,mid;
/*while (l <= r)//开始二分查找(书上的)此处 l<=r,则不存在该元素判断语句为l>r
{
mid = (l + r)/2;
if (L.data[mid] == e) break;
else if (e < L.data[mid]) r = mid-1;
else l = mid + 1;
}
*/
while (l < r)//形式二:开始二分查找(自己习惯的)此处 l<r,则不存在该元素判断语句为l>=r
{
mid = (l + r) / 2;
if (L.data[mid] == e) break;
else if (e < L.data[mid]) r = mid;
else l = mid + 1;
}
if (L.data[mid] == e && mid != L.length-1)
{
int temp = L.data[mid];
L.data[mid] = L.data[mid + 1];
L.data[mid + 1] = temp;
}
if (l >= r)//进行插入操作 插入下标点是 mid
{
ListInsert(L, mid + 1, e);
/* for (int j = L.length; j > mid; j--) //这里的mid是待插入数组的下标
{
L.data[j] = L.data[j - 1];
}
L.data[mid] = e;
L.length++;
*/}
}
void PrintList(SeqList &L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d\n", L.data[i]);
}
}
int main()
{
SeqList A; InitList(A);
int array[7] = { 1,2,3,3,5,6,7 };
for (int i = 0; i < 7; i++)
{
ListInsert(A, i+1 , array[i]); //在第几位插入,i不是数组下标
}
LocateElem(A, 4);
PrintList(A);
return 0;
}