二分法应用于有序排列的数组,所以我测试数据,先写了字母排序函数,再对排序后的字母数组进行二分法查找'h'。你参考吧。
#include <stdioh>#include <stringh>
void px(char str);//将字母数组升序排列
int main()
{
char str[]="abctuvwxyzijkldefghrsmnopq";
int i,count=0,mini=0,len=strlen(str),maxi=len-1,midi=(maxi-mini)/2;
px(str);
printf("排序后的字母数组为:%s\n",str);
while(1)//通过2分法找到字母‘h’的数组下标
{
if('h'<str[midi])
{
maxi=midi;
midi=(maxi-mini)/2+mini;
}
if('h'>str[midi])
{
mini=midi;
midi=(maxi-mini)/2+mini;
}
if('h'==str[midi])
{
i=midi;
break;
}
if('h'==str[maxi])
{
i=maxi;
break;
}
if('h'==str[mini])
{
i=mini;
break;
}
count++;
}
printf("通过二分法查找,字母%c在数组的下标为:%d,共迭代次数%d次\n",str[i],i,count);
return 0;
}
void px(char str)//将字母数组升序排列
{
int i,j;
char c;
for(i=0;i<strlen(str);i++)
{
for(j=i+1;j<strlen(str);j++)
{
if(str[i]>str[j])
{
c=str[i];
str[i]=str[j];
str[j]=c;
}
}
}
}
举个例子:
//二分查找法//
# include<stdioh>
void main()
{
int a[16],i,num,flag=0,top,bottom,mid;
//定义一个一维数组a[16]用来存放供查找用的数据,但只用a[1]——a[15]//
//num用来放要查找的数据,flag是表示是否找到的开关变量,top表示查找的起始位置,bottom表示查找的终止位置,mid表示top与bottom的中间位置//
char goon;
//变量goon为'y'或'Y'时表示继续下一轮查找,否则终止程序//
printf("请输入第1个数字:\n");
scanf(" %d",&a[1]);
//依次输入第二到第十五个数,并要求输入的数递减//
for(i=2;i<=15;i++)
{
printf("请输入第%d个数字:\n",i);
scanf(" %d",&a[i]);
if(a[i]>=a[i-1])
{
printf("请再次输入,它应该比上一个数小:\n");
scanf(" %d",&a[i]);
}
}
//输出刚才输入的数//
printf("你刚才输入的数是:\n");
for(i=1;i<=15;i++)
printf(" %d",a[i]);
printf("\n");
//查找循环开始//
do
{
printf("现在请输入你要查找的数:\n");//输入想要查找的数//
scanf(" %d",&num);
top=15;
bottom=1;
mid=15/2+1;
if(num>a[1] || num<a[15])//如果要查找的数据不在规定范围内,令flag=1,输出超出范围的信息//
{
flag=1;
printf("你所要查找的数字不在范围内!\n");
}
while(flag==0 && (top-bottom)>0)//如果在规定的范围内,开始二分法查找//
{
if(num==a[mid])//找到所需数据,退出本层循环//
{
printf("你所要查找的数字是第%d个。\n",mid);
flag=1;
}
else if(num>a[mid])//如果要查找的数据比a[mid]大,在前半数组查找//
{
top=mid+1;
mid=(top+bottom)/2;
}
else //如果要查找的数据比a[mid]小,在后半数组查找//
{
bottom=mid-1;
mid=(top+bottom)/2;
}
}
if(flag==0)//如果未找到数据,输出找不到的信息//
printf("无法找到你要找的数字!\n");
printf("是否继续查找?(Y/N):\n");//询问是否开始下一轮查找//
scanf(" %c",&goon);
}while(goon=='y' || goon=='Y');
}
void InsertSort(sq R)
这个函数是按值传递参数的。换句话说,你的顺序表在传递的时候被复制了一遍,然后这个函数收到的是一个副本,然后这个程序也许成功排序了这个副本,但是你原来的顺序表并没有改变。你可以考虑传递这个顺序表的指针。比如这样
void InsertSort(sq pR){
sq R = pR;
//以下不变
}
调用的时候传递R的地址
InsertSort(&R);二分法查找算法:
1 主要思想是:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
2 时间复杂度: O(log2n)。
3 C语言源代码(小例子)
search函数即为核心代码:递归查找
#include<stdioh>int search(int a, int num, int low, int high)
{
int mid =(low + high)/2;
if(low<=high)
{
if(num < a[mid])
return search(a, num, low, mid-1); //加return
if(num > a[mid])
return search(a, num, mid+1, high);//加return
if(num==a[mid])
return 1;
}
else
return 0;
}
int main(){
int a[11] = {0, 1, 2, 3, 4, 5, 9, 11, 12, 13, 15};
if(search(a, 11, 0, 10)==1)
printf("success!!");
else
printf("failed!!");
}
我运行过了,没错,基本符合你的要求,你可以试试看。
#include
<stdioh>
#define
N
10
void
main()
{
int
i,number,top,bott,mid,loca,a[N],flag=1,sign;
char
c;
printf("请输入10个数字:\n");
scanf("%d",&a[0]);
i=1;
while(i<N)
{scanf("%d",&a[i]);
if(a[i]>=a[i-1])
i++;
else
printf("输入数字顺序不是由小到大请重输:\n");
}
printf("\n");
for(i=0;i<N;i++)
printf("%2d",a[i]);
printf("\n");
while(flag)
{printf("请输入要查找的数字:");
scanf("%d",&number);
sign=0;
top=0;
bott=N-1;
if((number<a[0])||(number>a[N-1]))
loca=-1;
while((!sign)&&(top<=bott))
{mid=(bott+top)/2;
if(number==a[mid])
{loca=mid;
printf("在数组中发现数字
%d,在数组中该数字是第%d位\n",number,loca+1);
sign=1;
}
else
if(number<a[mid])
bott=mid-1;
else
top=mid+1;
}
if(!sign||loca==-1)
printf("在数组中没有数字
%d\n",number);
}
}
二分法查找有一个前提,数据应该是排好序的,假设从小到大排列,则:
首先用中间那个数(也可以不是正中间,差一两位没有关系,只要保证不忽略数据就行)与查找值比较,大于查找值就跳到左边。
然后重新设定新的数列。新的数列为,从最小的数值到中间那个数。
以这个新的数列为基础,重复以上步骤。
以上就是关于C语言 怎么用二分法在字母数组{'a','b','g','w'}中查找'h'全部的内容,包括:C语言 怎么用二分法在字母数组{'a','b','g','w'}中查找'h'、C语言中二分法的具体程序是什么呢、c语言中如何将顺序表排序并实现二分法查找等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)