您的位置:首页 > 其它

二分查找---顺序查找

2013-12-23 23:14 381 查看
顺序查找:在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。复杂度为o(n).

二分查找又称折半查找,它是一种效率较高的查找方法。
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
【算法复杂度】假设其数组长度为n,其算法复杂度为o(log(n))

#include <stdio.h>

//二分查找:
int search(int a[],int x,int n) //x为要查找的元素,n为数组长度
{
int mid=0;
int low=0;
int high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
{ return mid; }
else if(x<a[mid])
{ high=mid-1; }
else
{ low=high+1; }
}
return -1;
}
//顺序查找:
int search1(int a[],int x,int n) //x为要查找的元素,n为数组长度
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==x)
return i;
}
return -1;
}

int main()
{
int i,a[10],x;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("请输入要查找的元素");
scanf("%d",&x);
if(search(a,x,10)!=-1)printf("查找的元素在数组中的位置为%d.\n",search(a,x,10));
else printf("该元素不在数组中\n");
if(search1(a,x,10)!=-1)printf("查找的元素在数组中的位置为%d.\n",search1(a,x,10));
else printf("该元素不在数组中\n");
return 0;
}

评论|0

2008-11-25 12:40friday_collin|七级

/*顺序查找:*/
#include<stdio.h>
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,x,y;
printf("输入你要查找的数:\n");
scanf("%d",&x);
y=0; //标记是否已找到,y=1表是找到了,y=0表示没找到
for(i=0;i<10;i++) //循环,把x和数组中的元素一个个比较
{
if(x==a[i]) //如果x=a[i]说明已经找到
{
y=1; //把y变成1,说明已经找到了
printf("你要查找的数%d在第个%d位置\n",x,i+1); //输出找到的相关信息
break; //跳出循环
}
}
if(y==0)printf("无法找到你要查找的数\n"); //y=0表示找不到
}

/*二分查找:   添个主函数调用下就好了*/
int search(int a[],int x,int n)
{
int mid=0;
int low=0;
int high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
{ return mid; }
else if(x<a[mid])
{ high=mid-1; }
else
{ low=high+1; }
}
return -1;
}
************************************************************************

#include <stdio.h>
void sort(int a[], int i,int num);
main()
{
int a[4]={2,3,4,5};
int num;
printf("请输入要查找的号码:");
scanf("%d",&num);
sort(a,4,num);

}
//二分法 a[]为数组,n为数组大小,num为要查找的数字
void sort(int a[],int n,int num)
{
int high,low,mid,flag = 1;
high=n-1;
low=0;
while(low<=high)
{
mid = (high+low)/2;
if(a[mid]<num)
{
low = mid+1;
}
else if(a[mid]>num)
{
high = mid -1;
}
else
{
printf("位置在第%d位:",mid+1);
printf("%d",a[mid]);
flag = 0;
break;
}
}
if(flag)
{
printf("无此数字");
}
}


  

题目:用选择法对10个数字排序(从小到大),
然后输入一个数,用折半法找出该数是数组中第几个元素的值,
如果该数不在数组中,则打印出“无此数”。源程序命名为4.c其中选择法部分已经写出,折半法怎么写啊?
希望大侠尽量用折半法最常规的思路。

#include<stdio.h>
void main()
{  int a[11],i,t,j;
printf("please input 10 numbers :\n");
for(j=1;j<11;j++)
scanf("%d",&a[j]);
printf("\n");
for(j=1;j<11;j++)
for(i=j+1;i<11;i++)
if (a[j]<a[i])
{      t=a[j];      a[j]=a[i];      a[i]=t;     }

puts("Please input the number to be found");
scanf("%d",&t);
putchar('\n');i=1;j=10;//i,j表示在在数组a的第i个到第j个元素的范围内查找t
while (i<j)//i==j表明t只有可能是数组a的第i个元素
{
if (t<=a[(i+j)/2])
j=(i+j)/2;//此时t在第i个到第(i+j)/2个元素的范围内

else i=(i+j)/2+1;//此时t在第(i+j)/2+1个到第j个元素的范围内
}
if (a[i]!=t)
puts("No such element!");//没找到
else
printf("%d is element %d of the array.\n",t,i);//找到了
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: