C算法——查找 二分查找算法

源码+注释

//
// Created by Lenovo on 2022-05-28-下午 4:53.
// 作者:小象
// 版本:1.0
//

#include 
#include 

#define MAXSIZE 2147483647 // int型0~21亿 顺序表可能达到的最大长度10位
#define OK 1
#define ERROR 0

// 数据元素类型定义
typedef struct {
    int key; // 关键字域
    int otherInfo; // 其他域
} ElemType;

// 顺序表定义
typedef struct {
    ElemType *elem; // 存储空间的基地址
    int length; // 当前长度
} SqSTable;

int InitTable(SqSTable *table); // 顺序表的初始化
int CreateTable(SqSTable *table, int length); // 顺序表的创建
int SearchBin(SqSTable table, int key); // 二分查找

/**
 * 

二分查找

* @return 0 */
int main() { SqSTable table; if (!(InitTable(&table))) { printf("空间申请失败!!!"); } // 1-122222 CreateTable(&table, 122222); printf("二分查找结果:%s \n", SearchBin(table, 333) == 0 ? "没有找到" : "找到了"); getchar(); } // 构造一个空的顺序表 int InitTable(SqSTable *table) { table->elem = (ElemType *) malloc(sizeof(SqSTable) * MAXSIZE); // 动态方式需要先分配内存,而且 // 需要用到malloc函数申请,有可能申请不到,申请到后malloc()函数会把申请到的连续数据空间首地址返回 // 注意:这里申请到返回的地址是十六进制的地址,而elem只能存十进制的地址,所以需要强转为十进制地址后赋值 if (table->elem == NULL) { // 如果没有申请到地址,退出 return ERROR; } table->length = 0; // 空表长度为 0 return OK; // 初始化成功 } // 顺序表的创建 int CreateTable(SqSTable *table, int length) { if (table->length != 0) { // 顺序表不为空,不创建 return ERROR; } for (int i = 1; i <= length; i++) { // 第一个数默认不使用 table->elem[i].key = i; table->length++; // 表长加 1 } return OK; } // 在有序表table中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0 int SearchBin(SqSTable table, int key) { // 置 查找区间 初值 int leftIndex = 1; // 第一个数默认不使用 int rightIndex = table.length; while (leftIndex <= rightIndex) { // 循环限制条件:查找过程中如果没有找到的情况,会造成栈溢出 int minIndex = (leftIndex + rightIndex) / 2; // 二分查找的精髓:先找到中间那个数 if (key == table.elem[minIndex].key) { // 如果需要查找的数等于中间那个数,则直接输出中间那个数(即需要查找的数的)下标 return minIndex; // 找到待查元素 } else if (key < table.elem[minIndex].key) { // 如果需要查找的数小于中间那个数,说明需要从中间那个数的左边第一个数继续进行二分查找,其他不变 rightIndex = minIndex - 1; } else { // 如果需要查找的数大于中间那个数,说明需要从中间那个数的右边第一个数继续进行二分查找,其他不变 leftIndex = minIndex + 1; } } return 0; // 表中不存在待查元素 }

你可能感兴趣的:(C,算法,c语言,数据结构,学习,经验分享,开发语言)