下面的程序提供了两种搜索方法,第一种较为直观,但是效率低。
- #include <stdio.h>
- #include <sys/time.h>
- // 给定一个包含 n 个元素的数组 a,对 who 进行二进制搜索;成功返回 who 的位置,否则返回 -1
- int binary1(int n, int a[n], int who) {
- int left = 0;
- int right = n-1;
- while (left <= right) {
- int mid = left + (right-left)/2;
- if (who < a[mid])
- right = mid - 1;
- else if (who > a[mid])
- left = mid + 1;
- else
- return mid;
- }
- return -1;
- }
- // 给定一个包含 n 个元素的数组 a,对 who 进行二进制搜索;成功返回 who 的位置,否则返回 -1
- int binary2(int n, int a[n], int who) {
- int p = n/2;
- while (n > 0) {
- n = n/2;
- if (who < a[p]) {
- p -= n;
- } else if (who > a[p]) {
- p += n;
- } else
- return p;
- }
- return -1;
- }
- // 返回before 和 after 的差值(以微妙计算
- long timediff(struct timeval before, struct timeval after) {
- long sec = after.tv_sec - before.tv_sec;
- long microsec = after.tv_usec - before.tv_usec;
- return 1000000*sec + microsec;
- }
- int main() {
- int a[] = {1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33};
- int n = sizeof(a)/sizeof(int);
- int where;
- struct timeval before;
- struct timeval after;
- int k;
- int j;
- gettimeofday(&before, NULL);
- for (j = 0; j < 1000000; j++)
- for (k = 0; k < 2*n+1; k++) {
- where = binary1(n, a, k);
- // printf("who = %d, \tvalue = %d\n", k, where);
- }
- gettimeofday(&after, NULL);
- printf("before=[%ld,%ld], after=[%ld,%ld]\n", before.tv_sec, before.tv_usec, after.tv_sec, after.tv_usec);
- printf("The difference is %ld\n", timediff(before, after));
- printf("---------------------------------------------\n");
- gettimeofday(&before, NULL);
- for (j = 0; j < 1000000; j++)
- for (k = 0; k < 2*n+1; k++) {
- where = binary2(n, a, k);
- // printf("who = %d, \tvalue = %d\n", k, where);
- }
- gettimeofday(&after, NULL);
- printf("before=[%ld,%ld], after=[%ld,%ld]\n", before.tv_sec, before.tv_usec, after.tv_sec, after.tv_usec);
- printf("The difference is %ld\n", timediff(before, after));
- return 0;
- }
输出结果:
注意:<sys/time.h> 是Linux中的头文件,以上程序在 VC6.0 中编译不能通过,笔者在 MinGW 5 下编译通过。
笔者顺便推荐一款国产C语言开发神器 -- C-Free 5.0 -- 默认编译器是 MinGW,详情请查看:C-Free 5.0下载[带注册码][赠送破解版][最性感的C、C++开发工具IDE]