c语言的折中查找法的算法

Python021

c语言的折中查找法的算法,第1张

#include <stdio.h>

#define N 21

void main(void)

{

int a[N]

int i,n,num

int top,bottom,mid

int flag=1//如果在表列中找到数字,则值为1,否则为0

int loc=-1//要查找的数在表列中的位置,如果loca=-1表示表列中没有这个数如果有这个数,则它的值为所在的位置

printf("你想在多少个数中进行折半查找,请输入(1--20):")

scanf("%d",&n)

while(n<1 || n>20)

{

printf("你输入的数不正确,请重新输入。\n")

printf("你想在多少个数中进行折半查找,请输入(1--20):")

scanf("%d",&n)

}

printf("请你输入一个整数 a[1]:")

scanf("%d",&a[1])

i=2

while(i<=n) //输入从小到大的表列

{

printf("请你输入一个整数 a[%d]:",i)

scanf("%d",&a[i])

if(a[i] >a[i-1])

i++

else

printf("你输入的数不满足要求,请重新输入。\n")

}

//输出表列

printf("\n输出表列\n")

for(i=1i<=ni++)

{

printf("%6d",a[i])

}

printf("\n")

printf("请你输入要查找的数:")

scanf("%d",&num)

flag=1//假设输入的数在表列中

top=n

bottom=1

mid=(top+bottom)/2

while(flag)

{

printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid])

if( (num>a[top]) || (num<a[bottom]) ) //输入的数 num>a[top] 或者 num<a[bottom],肯定num不在这个表列中

{

loc=-1

flag=0

}

else if(a[mid]==num) //如果num 等于找到的数

{

loc=mid

printf("找到数 %6d 的位置%2d\n",num,loc)

break

}

else if(a[mid]>num) //若 a[mid]>num,则num 一定在 a[bottom]和a[mid-1]范围之内

{

top=mid-1

mid=(top+bottom)/2

}

else if(a[mid]<num) //若 a[mid]<num,则num 一定在 a[mid+1]和a[top]范围之内

{

bottom=mid+1

mid=(top+bottom)/2

}

}

if(loc==-1)

{

printf("%d 这个数在表列中没有找到。\n",num)

}

printf("折半查找结束:")

scanf("%d",&n)

}

查找的意义是在一堆数据中,使用方法找到你想要找的数据。

一般为分:顺序和折半(又叫二分)查找两种方法。

存放在数组中的数据就可以看成一堆数据,在有限数组内存放一些数据,通过使用查找方法进行查找想要找的数。

顺序方法:这种查找方法不需要数组排序,数据可以是无序的。从数组开头向后一个一个与被查找数进行比较,如果找到就做相应的操作(如输出这个数的下标或位置)等。

折半查找法:(二分查找)

前提需要把数组里的数据进行排序(升序或降序)。思路是(假设数组已按升序排序)每次只比较中间的数据(一段距离内),第一次先和中间的数组(下标是这个数组中在中间的)比较,如果相同,则说明被找数已找到。否则就要判断是在大于还是小于:如果是大于,那么就将在中间+1至最后一个数之间的中间数再进行比较。否则就将在第一个至中间-1的数进行比较;再次重复比较,直到找到数为止。

#include<stdio.h>

#include<math.h>

void main()

{

void function1()//搜索法

void function2()//二分法

void function4()//牛顿法

int choice

printf("请选择求解的方法:\n\t1.搜索法\n\t2.二分法\n\t3.牛顿法\n:")

switch(1)

{

case 1:function1()

case 2:function2()

case 4:function4()

}

}

void function1()//搜索法计算非线性方程的解

{

double expression1(double)

double lpoint=1.0,rpoint=2.0,step=0.0001

while(expression1(lpoint)<-0.00001)

{

lpoint=lpoint+step

}

printf("运用搜索法所求结果:%f\n",lpoint)

}

void function2()//二分法计算非线性方程的解

{

double expression1(double)

double lpoint=1,rpoint=2,mpoint

mpoint=(lpoint+rpoint)/2

while(fabs(expression1(mpoint))>0.00001)

{

mpoint=(lpoint+rpoint)/2

if(expression1(lpoint)*expression1(mpoint)<0)

rpoint=mpoint

else

lpoint=mpoint

}

printf("运用二分法所求结果:%f\n",mpoint)

}

void function4()//牛顿法计算非线性方程的解

{

double expression1(double)

double expression2(double)

double x=1.5

while(expression1(x)>0.00001)

{

x=x-expression1(x)/expression2(x)

}

printf("运用牛顿法所求结果:%f\n",x)

}

double expression1(double x)

{

double result

result=x*x*x-x*x-1

return result

}

double expression2(double x)

{

double result

result=3*x*x-2*x

return result