博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带---有测试代码----的二分法查找(折半查找)
阅读量:3525 次
发布时间:2019-05-20

本文共 1775 字,大约阅读时间需要 5 分钟。

#include 
#include
/* * 带有测试代码的二分法查找 * Precondition:已经排好序 * Maintenance:如果find_this 在数组中的话 就一定能找得出来 * Postcondition:如果find_this 不在数组中的话,就一定要保证能返回-1 * */#define len 8int arr[] = {1,2,2,2,5,6,8,9};int is_sort(void){ int i; for(i = 0; i < len; i++) if(arr[i - 1] > arr[i]) return 0;//非排好序,返回错误 return 1;//排好序的}int mustbe(int start,int end,int find_this){ int i; for(i = 0; i < start; i++) if(arr[i] == find_this) return 0;//返回错误 for(i = end + 1; i < len; i++) if(arr[i] == find_this) return 0;//返回错误 return 1;//正确}int contains(int n){ int i; for(i = 0; i < len; i++) if(n == arr[i]) return 1;//确保要找的数在数组中 return 0;//要找的数不在数组中}int binary_search(int find_this){ int mid,start = 0,end = len; /* * Precondition * */ assert(is_sort());//保证数组是已经排好序的 while(start <= end) { mid = (start + end) / 2; /* * Maintenance * */ assert(mustbe(start,end,find_this)); /* * 要找的数位于右半部分 * 结束边界不变,还是end * 开始边界是之中间边界加1,所以是mid + 1 * */ if(arr[mid] < find_this) start = mid + 1; /* * 要找的数位于左半部分 * 起始边界不变,结束边界是之前的中间边界减1所以是mid - 1 * */ else if(arr[mid] > find_this) end = mid - 1; /* * 这个就是要找的数 * */ else { /* * Postcondition1 * */ assert(mid >= start && mid <= end && arr[mid] == find_this); return mid; } } /* * 没有要找的数,返回失败 * Postcondition2 * */ assert(!contains(find_this)); return -1;}int main(){ int i; for(i = 0; i < len; i++) printf("%d ",arr[i]); printf("\n"); int find; printf("What you wanna find:"); scanf("%d",&find); int res = binary_search(find); printf("pos = %d,brr[%d] = %d\n",res,res,arr[res]);}

测试代码只是由于开发调试用,软件正式版发布时可以用  -DNDEBUG 来屏蔽运行测试代码

如:gcc -DNDEBUG xx.c  这样的方式就可以禁用assert.h中的assert宏定义,这样代码中的所有assert测试都不起作用了。

 

或者是在头上添加"#define NDEBUG"

#define NDEBUG

#include <stdio.h>
#include <assert.h>
...

 

 

转载地址:http://nxuhj.baihongyu.com/

你可能感兴趣的文章
缓存:局部性
查看>>
mysql原理:b+树索引
查看>>
mysql原理:最左原则
查看>>
mysql原理:join标到底是什么,为什么有军规不建议超过三个
查看>>
redis缓存穿透
查看>>
redis缓存雪崩
查看>>
mysql的事务隔离
查看>>
mvc架构
查看>>
ElasticSearch(0) ES的认识
查看>>
JPA入门
查看>>
JPA关系
查看>>
4.spring注解和生命周期相关的(了解)
查看>>
3.spring 的纯注解配置
查看>>
4.Spring 整合 Junit
查看>>
安装配置 Kali Linux 笔记
查看>>
持久加密U盘安装 Kali Linux 笔记
查看>>
[ 笔 记 ] netcat 传输信息 / banner
查看>>
[ 笔 记 ] 主动信息收集_002
查看>>
[ CTF ] ssh私钥泄漏_笔记
查看>>
设计模式学习
查看>>