查找:
顺序查找:
顺序表:略
链表:
Lnode* search(Lnode *head, int x)
{
Lnode *p=head->next;
while (p != NULL)
{
if(p->data==x)
{
return p;
}
p= p->next;
}
return NULL;
}
ASL:
找到为∑_(i=1)^n▒〖i/n〗=(1/n)n(1+n)/2=(n+1)/2
没找到为n
折半查找:
int Bsearch(int R[], int low,int high,int k)
{
while(low<high)
{
int mid= (low+high)/2;
if (R[mid]==k)
{
return mid;
}
else if (R[mid]>k)
{
high= mid-1;
}
else
low= mid+1;
}
return -1;
}
ASL:近似log2(n+1)-1
分块查找:
折半查找和顺序查找合并
二叉排序树
查找:
typedef struct BTNode
{
int k;
struct BTNode *lchild;
struct BTNode *rchild;
} BTNode;
BTNode* BSTSearch(BTNode* bt,int k)
{
if (bt=NULL)
{
return NULL;
}
else
if (bt->k == k)
{
return bt;
}
else if(bt->k>k)
{
return BSTSearch(bt->lchild,k);
}
else
{
return BSTSearch(bt->rchild,k);
}
}
插入:
int BSTinsert(BTNode &bt,int key)
{
if (bt==NULL)
{
bt=(BTNode)malloc(sizeof(BTNode));
bt->lchild=NULL;bt->rchild=NULL;
bt->k=key;
return 1;
}
else
{
if (bt->k == key)
{
return 0;
}
else if(bt->k>key)
{
return BSTinsert(bt->lchild,key);
}
else
{
return BSTinsert(bt->rchild,key);
}
}
}