數據結構-----查找算法

查找:
1、順序查找
2、二分查找(折半查找)
3、分塊查找
4、數表的動態查找(二叉排序樹查找、平衡二叉樹AVL樹、B樹、B+樹)
5、哈希查找

---------------------------
順序查找
說明:順序查找適合於存儲結構爲順序存儲或鏈接存儲的線性表。

int SequelSearch(elemtype s[],keytype Key,int n)
/*在s[0]-s[n-1]中順序查找關鍵字爲Key的記錄*/
/*查找成功時返回該記錄的下標序號;失敗時返回-1*/
{
int i;
i=0;
while(i<n&&s[i].Key!=Key)

i++;

if(s[i].Key==Key)

return i;
else

return -1;
}

----------------------------
二分查找

1、遞歸方法實現:
int BSearch(elemtype a[],elemtype x,int low,int high)
/*在下屆爲low,上界爲high的數組a中折半查找數據元素x*/
{
int mid;
if(low>high)

return -1;
mid=(low+high)/2;
if(x==a[mid])

return mid;
if(x<a[mid])

return(BSearch(a,x,low,mid-1));


else

return(BSearch(a,x,mid+1,high));
}

2、非遞歸方法實現:
int BSearch(elemtype a[],keytype key,int n)
{
int low,high,mid;
low=0;

high=n-1;
while(low<=high)
   {
      mid=(low+high)/2;
      if(a[mid].key==key)

      return mid;
      else if(a[mid].key<key)

      low=mid+1;
      else

       high=mid-1;
   }
return -1;
}

--------------------------
分塊查找

typedef int keytype;

typedef struct
{
keytype Key;
}elemtype;

typedef struct
{
keytype Key;
int Link;
}indextype;

int IndexSequelSearch(indextype ls[],elemtypes[],int m,int l,keytype Key)
/*分塊查找關鍵字爲Key的記錄。索引表爲ls[0]-ls[m-1]*/
/*順序表爲s,塊長爲l*/
{
int i,j;
/*在索引表中順序查找*/
i=0;
while(i<m&&Key>ls[i].Key)i++;

if(i>=m)return -1;
else
{
    /*在順序表中順序查找*/
    j=ls[i].Links;
    while(Key!=s[j].Key&&j-ls[i].Link<l)j++;

    if(Key==s[j].Key)return j;
    else return -1;
}
}

----------------------------
二叉排序樹查找

1、二叉排序樹查找算法:
a、非遞歸算法:
btree *search(btree *b,int x)
/*在二叉樹b中查找x的過程*/
{
if(b=NULL)

return(NULL);
else
   {
     if(b->data==x)

    return(b);
     if(x<b->data)

     return(search(b->left));
     else

     return(search(b->right));
   }
}

b、遞歸算法:
bsnodetype *Search(bsnodetype *bt,keytype Key)
/*在二叉樹bt中查找元素爲Key的元素*/
{
bsnodetype *p;
if(bt==NULL) return(bt);

p=bt;
while(p->Key!=Key)
{
    if(Key<p->Key) p=p->Lchild;
    else p=p->Rchild;
    if(p==NULL)break;
}
return(p);
}


2、二叉樹的生成
a、向一個二叉樹b中插入一個結點s的函數如下:
void insert(b,s)
btree *b,*s;
{
if(b==NULL) b=s;
else if(s->data==b->data)
       return();
else if(s->data<b->data)
       insert(b->left,s);
else if(s->data>b->data)
       insert(b->right,s);
}

b、生成二叉樹
void create(btree *b)
{
int x;
btree 8s;
b==NULL;

do
{
   scanf("%d",&x);
   s=(bnode *)malloc(sizeof(bnode));
   s->data=x;
   s->left=NULL;
   s->right=NULL;
   insert(b,s);
}while(x!=-1);
}

c、從二叉樹中刪除一個結點

bsnodetype *Delete(bsnodetype *bt,keytype Key)
/*在bt爲根結點的二叉樹中刪除值爲Key的結點*/
{
bsnodetype *p,*q;
if(bt->Key==Key)
{
    /*bt的左右子樹均爲空*/
    if(bt->Lchild==NULL&&bt->Rchild==NULL)
     {
       free(bt); /*刪除葉結點*/
       return(NULL);
     }
    else if(bt->Lchild==NULL)/*bt的左子樹爲空*/
     {
       p=bt->Rchild;
       free(bt);
       return(p);
     }   
    else if(bt->Rchild==NULL)/*bt的右子樹爲空*/
     {
       p=bt->Lchild;
       free(bt);
       return(p);
     }
   else
    {
       p=q=bt->Rchild;
       while(p->Lchild!=NULL)p=p->Lchild;
       p->Lchild=bt->Lchild;
       free(bt);
       return(q);
    }
}

/*在bt->Lchild爲根結點的二叉樹中刪除值爲Key的結點*/
if(bt->Key>Key&&bt->Lchild!=NULL)
   bt->Lchild=Delete(bt->Lchild,Key);

/*在bt->Rchild爲根結點的二叉樹中刪除值爲Key的結點*/
if(bt->Key<Key&&bt->Rchild!=NULL)
   bt->Rchild=Delete(bt->Rchild,Key);

return(bt);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章