数据结构(C)---二分法随记

来源:互联网 发布:汉诺塔递归算法思想 编辑:程序博客网 时间:2024/04/29 13:24

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

void sort(int sore_num[] , int m );                             //排序函数
int search(int search_num[] , int search_n,int x);    //定义二分发函数

int main()
{
    int     n , i;                                                            // 定义数组个数和遍历数组的临时变量i
    int     x;
    printf("请输入数据个数:");
    scanf("%d" , &n);

    int  num[n];       

    for(i=0;i<n;i++)
    {
         printf("请输入第%d个数据:",i+1);
        scanf("%d" , &num[i]);
    }                                                                         //输入部分,不解释

    sort(num,n);                     

    printf("排序后新数组为:");

    while(i--)
    {
        printf(" %d",num[n-i-1]);
    }                                                                      //进行数组排序,并且输出

    printf("\n请输入要查找的数:");
    scanf("%d" ,&x);

    if (search(num, n ,x)==-1 )                        
    {
        printf("所需要查找的数据在数组中未找到");
    }else{

        printf("所输入的数据在新数组中的位置是:%d", search(num, n ,x));
    }                                                                      // 调用二分法查找函数,返回-1 则为找到  ,反之找到
    return 0;
}

void sort(int sore_num[] , int m )                    
{
    int     i , j;

    for(i=0;i<m;i++)
    {
        for(j=i+1;j<=m;j++)
        {
            if(sore_num[i]>sore_num[j])
            {
                sore_num[i]+=sore_num[j];
                sore_num[j]=sore_num[i]-sore_num[j];
                sore_num[i]-=sore_num[j];
            }
        }
    }

}                                                                                 //选择排序

 

int search(int search_num[] , int search_n,int x)
{
    int left , right , mid;                      
    int i=-1;
    left=0;
    right=search_n-1;                                                //定义left   right    mid   用来标记数组下标

    while(search_num[left]<=search_num[right])              //条件限定若左值大于右值循环结束(与排序后数组排列方式有关)
    {
        mid=(left+right)/2;

        if(search_num[mid]==x)
        {
            i=mid;
            left=right+1;                                                   //将i置为找到数下标  ,并使条件为false

        }else if(search_num[mid]>x){

            right=mid-1;                                              

        }else{
            left=mid+1;
        }
    }
    return  i;
}

 

 

 

 

思路:1.数组输入后 排序为有序数组,因为二分法只能查找有序数组

           2.定义左下标left=0 ,  右下标right=数组个数-1,   mid是left 和right的中间值

           3.当left>right时候为未找到,

           4.若需要查找的元素等于数组下标为mid的数的时候,将mid的值给i, 并使left=right+1使其条件不成立

           5.若需要查找的元素大于数组下标为mid的数的时候,将right置为mid 并-1,使mid为数组的右值的下标,返回继续进行判断。

          6. 若需要查找的元素小于数级下标为mid的数的时候,将left置为mid并+1,使mid 为数组的左值的下标,返回继续进行判断。

 

   第一次写博客,写的不好请见谅

        

0 0
原创粉丝点击