查找基本方法小结

查找的三种基本方法小结:

代码
二:查找
1:顺序查找
(整型与零的比较,
int i,用if(i!=0),或if(i==0)。

#include
"stdio.h"

bool SequenceSearch(int*& p,int k,int n,int& pos)
{
int i=0;
while (i<n && p[i]!=k)
{
i
++;
}
if (i>=n)
{
return false;
}
pos
=i;
return true;
}

int main()
{
int a[10]={4,7,1,3,2,9,8,0,5,6};
int* ptr=a;
int status;
bool flag;
flag
=SequenceSearch(ptr,62,10,status);
if (flag)
{
printf(
"Success:The No is %d \n",status);
}
else
printf(
"Failure...\n");
return 0;
}


2:折半查找
(前提是被查找序列必须是有序的,这次就忘记了,搞砸了!
~~~~(>_<)~~~~ ,)
#include
"stdio.h"

bool BinarySearch(int*& p,int key,int len,int& pos)
{
int low,high,mid;
low
=0;
high
=len-1;
while (low<=high)
{
mid
=(low+high)/2;
if (key<p[mid])
{
high
=mid-1;
}
else if (key>p[mid])
{
low
=mid+1;
}
else
{
pos
=mid;
break;
}
}
if (low>high)
{
return false;
}
return true;
}

int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int* ptr=a;
int status;
bool result=BinarySearch(ptr,1,10,status);
if (result)
{
printf(
"Success:the sequence No. is %d \n",status);
}
else
printf(
"Failure...\n");

return 0;
}


3:分块查找
#include
"stdio.h"
#include
"stdlib.h"
#include
"malloc.h"

/*
分块查找,又称索引顺序查找,结合了顺序查找和索引查找。
1: 索引查找过程中,采用的是二分法查找。
2: 顺序查找过程中,采用的是顺序查找。
索引表是有序的,分块表是块内无序,块间有序,前一个块的最大关键字要小于后一个块的最小关键字;但块内是无序的。
现在主要是建立索引表的问题。
*/

typedef
struct IndexTable
{
int key;
int address;
}Index;


bool IndexSearch(Index*& pIndex,int Indexlen,int*& p,int len,int k,int& pos)
{
int low=0,high=Indexlen-1,mid;
int b=len/Indexlen;
while (low<=high)
{
mid
=(low+high)/2;
if (k>pIndex[mid].key)
{
low
=mid+1;
}
else
high
=mid-1;
}
int i;
if (low<Indexlen)
{
for (i=pIndex[low].address;i<=pIndex[low].address+b-1 && p[i]!=k;i++);
if (i<=pIndex[low].address+b-1)
{
pos
=i;
return true;
}
else
return false;
}
return false;
}

int main()
{
int a[16]={9,22,12,14,35,42,44,38,48,60,58,47,78,80,77,82};
int* ptr=a;
Index
* pInd=(Index*)malloc(sizeof(Index)*4);
if (NULL==pInd)
{
exit(
1);
}
for (int i=0;i<4;i++)
{
scanf(
"%d ,%d ",&pInd[i].key,&pInd[i].address);
}
bool flag;
int status;
flag
=IndexSearch(pInd,4,ptr,16,38,status);
if (flag)
{
printf(
"Success: The sequence No. is %d \n",status);
}
else
printf(
"Failue...\n");
return 0;
}

4:二叉排序树的基本操作的实现
二叉排序树:一颗空的二叉树,或者是一颗具有如下性质的二叉树:
1):若左子树非空,则左子树上的所有结点的值均小于根结点的值
2):若右子树非空,则右子树上的所有结点的值均小于根结点的值
3):左,右子树又各是一颗二叉排序树

#include
"stdio.h"
#include
"malloc.h"
#include
"stdlib.h"

typedef
struct BTnode
{
char data;
struct BTnode* left,*right;
}BTree;

//创建一颗二叉树
BTree* Create()
{
BTree
* tree;
char ch;
scanf_s(
"%c",&ch);
getchar();
if (ch=='#')
{
return NULL;
}
else
{
tree
=(BTree*)malloc(sizeof(BTree));
if (NULL==tree)
{
return NULL;
}
tree
->data=ch;
tree
->left=Create();
tree
->right=Create();
return tree;
}
}

//前序遍历
void Preorder(BTree* t)
{
if (t!=NULL)
{
printf(
"%c ",t->data);
Preorder(t
->left);
Preorder(t
->right);
}
}

//中序遍历
void Inorder(BTree* t)
{
if (t!=NULL)
{
Inorder(t
->left);
printf(
"%c ",t->data);
Inorder(t
->right);
}
}

//后序遍历
void Postorder(BTree* t)
{
if (t!=NULL)
{
Postorder(t
->left);
Postorder(t
->right);
printf(
"%c ",t->data);
}
}

//查找某一个结点
BTree* Search(BTree* t,char ch)
{
if (NULL==t)
{
return NULL;
}
else
{
if (t->data==ch)
{
return t;
}
if (ch<t->data)
{
return Search(t->left,ch);
}
else
{
return Search(t->right,ch);
}
}
}

//插入一个结点
void Insert(BTree*& t,BTree* s)
{
if (NULL==t)
{
t
=s;
}
else if (s->data==t->data)
{
return;
}
else if (s->data<t->data)
{
Insert(t
->left,s);
}
else if (s->data>t->data)
{
Insert(t
->right,s);
}
}

int main()
{
BTree
* bt1=Create();
Preorder(bt1);
printf(
"\n");
Inorder(bt1);
printf(
"\n");
Postorder(bt1);
printf(
"\n");

BTree
* bt2=Search(bt1,'c');
if (bt2!=NULL)
{
printf(
"Success...\n");
printf(
"The number is:%c \n",bt2->data);
}
else
printf(
"Failure...\n");

BTree
* bt3=(BTree*)malloc(sizeof(BTree));
if (NULL==bt3)
{
exit(
1);
}
bt3
->data='e';
bt3
->left=NULL;
bt3
->right=NULL;
Insert(bt1,bt3);
Preorder(bt1);
printf(
"\n");
return 0;
}

 

posted on 2010-08-19 11:13  marrywindy  阅读(845)  评论(0编辑  收藏  举报

导航