您的位置:首页 > 其它

查找(一)静态查找的顺序查找和 有序折半查找

2013-08-06 11:53 946 查看
数据的静态查找:顺序表查找和 有序表的折半查找

顺序查找: 将数据与待查找的元素相比较,如果找到相同的元素,就表示查找成功,否则查找失败。值得注意的是,在程序中设置了一个哨兵项,位于数组的第0个合肥位置,这样做的好处是可以更方便的判断什么时候循环应该终止,减小循环中的比较次数,对提高效率有很大帮助。

有序表的折半查找:要先将数组的顺序排成有序的,比如说非降序的,然后再用折半查找法。折半查找的效率比有序查找高,但折半查找只适用于有序表,且限于顺序存储结构(对线性链表无法有效地进行折半查找)。

#include<stdio.h>
#include<stdlib.h>

//顺序表的查找
int Search_Seq(int ST[],int key,int n)
{
int i=0;
while( ST[i]!=key && i<n)
i++;
return i;
return -1;
}

//顺序表的查找
int Search_Seq1(int ST[],int key,int n)
{
int i,j;
int * arra = (int *)calloc(n+1,sizeof(int));//将原始数组装入一个新的数组中,该数组首字符为空,为哨兵使用
for(i=1;i<=n;i++)
*(arra+i) = ST[i-1];

arra[0] = key;

for(j=n; arra[j] != key; --j);
return j-1;//这里面的第j个相当于原数组里j-1个
}

//对数组ST进行排序
void sort_accend(int ST[],int len)
{
int i,j,index,min,temp;

for(i=0;i<len;i++)
{
min = ST[i];
for(j=i;j<len;j++)
if(ST[j]<min)
{
min = ST[j];
index = j;
}
temp = ST[i];
ST[i] = ST[index];
ST[index] = temp;
}
//for(int k=0;k<len;k++)
//  printf("%d\n",ST[k]);

}

//有序表的查找,折半查找
int Search_Bin(int ST[],int key,int len)
{
int low = 0;
int high = len -1;
int mid;

while(low<=high)
{
mid = (low+high)/2;
if( key < ST[mid] )
high = mid - 1;
else if( key > ST[mid] )
low = mid + 1;
else
return mid;
}
return -1;

}

int main()
{   int n = 8;
int ST[8] = {49,38,65,97,76,13,27,49};
int key;
int result;
printf("顺序表的查找,输入要查找的元素:\n");
scanf("%d",&key);

result = Search_Seq1(ST,key,n);
if( result!=-1)
printf("顺序查找成功,是第 %d 个元素\n",result);
else
printf("顺序查找不成功\n");

sort_accend(ST,n);//静态有序折半法查找,要先排序
for(int k=0;k<n;k++)
printf("%d\n",ST[k]);
printf("有序折半的查找,输入要查找的元素:\n");
scanf("%d",&key);
result = Search_Bin(ST,key,n);
if(result!=-1)
printf("有序折半查找成功,是第%d个元素\n",result);
else
printf("有序折半查找不成功");
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: