C语言 怎么用二分法在字母数组{'a','b','g','w'}中查找'h'

C语言 怎么用二分法在字母数组{'a','b','g','w'}中查找'h',第1张

二分法应用于有序排列的数组,所以我测试数据,先写了字母排序函数,再对排序后的字母数组进行二分法查找'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语言中如何将顺序表排序并实现二分法查找等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9340858.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存