数据结构考研复习(顺序查找&折半查找)

这部分内容和复习资料上写的不太一样,比如【哨兵】的存放位置,以及结果的呈现方式等。

需要注意的是折半查找要求数据有序顺序存储,所以要注意数据的输入。

顺序查找部分有个小bug,我暂时还没反应过来,具体表现为不能查找最后一个数据。

代码如下:

#include <stdio.h>
#define InitSize 100

typedef struct{//查找表的数据结构
    int *elem;//元素存储空间基址,建表时按照实际长度分配。0号单元留空
    int TableLen;//表的长度
}SSTable;

/* -1- 顺序查找*/
bool Search_Seq(SSTable ST,int key){
    ST.elem[ST.TableLen] = key;//将哨兵位置放到末尾
    ST.TableLen++;
    int i,j=1;
    i=(ST.TableLen-2);//将i赋值为末尾元素下表
    while(ST.elem[i]!= key){
        i--;
        j++;
    }
    printf("【顺序查找】当前查找次数为:%d次",j+1);//最后一次会跳出循环所以加一
    return true;
}

/* -2- 折半查找*/
int Binary_Search(SSTable ST,int key){
    int low = 0,high = ST.TableLen-1,mid,i=1;
    while(low <= high){

        mid = (low + high)/2;//取中间位置

        printf("---------------\n");
        printf("low:%d, ",low);
        printf("mid:%d, ",mid);
        printf("high:%d ",high);

        printf("\n---------------\n");
        if(ST.elem[mid] == key) {

            return i;//查找成功则返回所在位置
        }
        else if(ST.elem[mid]>key)
        {
            high = mid - 1;
            i++;
           //从前半部分继续查找
        }

        else
        {
            low = mid + 1;
            i++;
            //从后半部分继续查找
        }
    }
    return i;
}

bool Init_Tab(SSTable &ST){
    ST.elem = new int[InitSize];
    ST.TableLen = 0;
    return true;
}

bool Insert_Tab(SSTable &ST, int e){
    int i = ST.TableLen;
    ST.elem[i+1] = e;
    ST.TableLen ++;
    return true;
}

bool Get_Tab(SSTable ST, int i,int &e){
    e = ST.elem[i];
    return true;
}

int main(){
    SSTable ST;
    if(Init_Tab(ST)){
     printf("创建成功!\n");
    }
    int len,e_1;
    printf("请输入数据长度:\n");
    scanf("%d",&len);
    printf("依次输入%d个值:\n",len);
    for(int i = 1;i <= len;i++)
    {
        scanf("%d",&e_1);
        Insert_Tab(ST,e_1);
    }
    printf("\n");
    for(int j = 1;j <= len;j++){
        int e_2;
        Get_Tab(ST,j,e_2);
        printf("%d  ",e_2);
    }
    printf("\n");
    int key,k;
    printf("请输入要查找的元素:\n");
    scanf("%d",&key);
    printf("数据长度为:%d\n",len);
    printf("【折半查找】当前查找次数为:%d次",Binary_Search(ST,key));
    printf("\n");
    Search_Seq(ST,key);
}

运行结果:

 

 

 

posted on 2021-09-23 20:29  HOr7z  阅读(139)  评论(0编辑  收藏  举报