数据结构学习第11篇 - 二分查找算法

二分查找算法   

编写程序构造一个有序表PL,从键盘接收一个关键字key,分别用线性查找法和二分查找法(递归实现和非递归实现)在PL中查找key,并输出具体的查找过程。若找到则提示查找成功并输出key所在的位置,否则提示没有找到。

注意: 1.n个元素有序表可以直接定义[0:n-1];(n>=60

2.必须在写清楚二分查找法的算法思想(自己组织语言描述)

3.二分查找法必须实现迭代和递归两个版本.

4.必须输出中间过程;


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

#define MAXSIZE 100
#define LEN 100

typedef struct
{
    int data[MAXSIZE]; //存在范围0~MAXSIZE-1
    int length;  //长度
}SeqList;

void init(SeqList *L,int n)
{
    L->length=n;
    for(int i=0;i<L->length;i++)
    {
        L->data[i]=5*i+rand()%5;
    }
}

void print(SeqList *L)
{
       for(int i=0;i<L->length;i++)
    {
        printf("%4d ",L->data[i]);
    }
    printf("\n");
}

/********************1.线性查找法算法思想描述***********************/
//按顺序逐个寻找
//如果在序列中找到与查找元素相等的元素
//结束程序

//线性查找法的迭代版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素
int LinearSerach(SeqList *L,int key)
{
    int i,j;
    printf("\nLinearSerach\n");
    for(i = 0; i < L->length; i++)
    {
        if(L->data[i] == key)
        {
            return i+1;
        }
    }
    if(i == L->length)
    {
        return -1;
    }
}


/********************2.二分查找法算法思想描述***********************/
//先找到序列的中间元素
//把中间元素与查找元素比较大小。当该序列为空时,查无此元素,结束寻找;两者相等时找到查找元素,终止寻找。
//中间元素大于查找元素时,把序列左边子序列重复上面查找
//中间元素小于查找元素时,把序列右边子序列重复上面查找

//二分查找法的迭代版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素
int BinarySerach1(SeqList *L,int key)
{
    
    int i,j,k,mid,low,high;
    low = 0;
    high = L->length;
    mid = (low + high) / 2 ;
    print(L);
    printf("   位置是:第%d个\n",mid + 1);
    while(low <= high && L->data[mid] != key )
    {
        if(L->data[mid] > key)
        {
            high = mid - 1;
            mid = (low + high) / 2;
        }    
        else if(L->data[mid] < key)
        {
            low = mid + 1;
            mid = (low + high) / 2;    
        }
        print(L);
        printf("   位置是:第%d个\n",mid + 1);
    }
    if(low > high)
    {
        return -1;
    }
    if(L->data[mid] == key)
    {
        return mid+1;
    }
}

//二分查找法的递归版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素,
//low为本次查找范围的下限,high为本次查找范围的上限
int BinarySerach2(SeqList *L,int key,int low,int high)
{
    int mid;
    mid = (low + high) / 2;
    print(L);
    printf("   位置是:第%d个\n",mid + 1);    
    if(low > high)
    {
        return -1;
    }
    if(L->data[mid] == key)
    {
        return mid+1;
    }
    else if(L->data[mid] > key)
    {
        return BinarySerach2(L, key, low, mid - 1);
    }
    else if(L->data[mid] < key)
    {
        return BinarySerach2(L, key, mid + 1, high);
    }
}

int main()
{
    SeqList L;
    int key;
    int a;
    init(&L,LEN);
    print(&L);
    printf("请输入你要查找的数字:\n");
    scanf("%d",&key);
    a = LinearSerach(&L,key);
    if(a == -1)
    {
        printf("查无此数!\n");
    }
    else
    {
        printf("该元素的位置是:第%d个\n",a);
    }
    
    
    printf("\nBinarySerach迭代\n");
    a = BinarySerach1(&L,key);
    if(a == -1)
    {
        printf("查无此数!\n");
    }
    else
    {
        printf("该元素的位置是:第%d个\n",a);
    }
    
    printf("\nBinarySerach递归\n");
    a = BinarySerach2(&L,key,0,L.length);
    if(a == -1)
    {
        printf("查无此数!\n");
    }
    else
    {
        printf("该元素的位置是:第%d个\n",a);
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/guanshanyue96/article/details/89008402
今日推荐