1: /*
2: * 作 者:邓勖帆 (Kyle)
3: * 个人主页:U2U (Http://U2USoft.CNBlogs.com/)
4: *
5: * 项 目:实验5.2 数组
6: * 文件名称:Assignment_52.cpp
7: * 创建日期:2009年6月15日
8: * 当前版本:1.1
9: * 摘 要:二分查找法
10: *
11: * 编码风格:C/C# Crossover
12: * 目标平台:Windows 2003/XP以上(x86/x64)
13: * 编译说明:在VC++ 2008、Intel C++ Compiler 11.0下正确编译
14: */
15:
16: #include "stdafx.h"
17: #include <conio.h>
18:
19: #define pause() do{printf("\n请按任意键继续...\n");_getch();} while(0) 20: #define BSEARCH_ARY(ary,key,func) myBSearch(ary,key,sizeof(ary)/sizeof(ary[0]),sizeof(ary[0]),func)
21:
22: //----------------------------------------------------------
23: // 函数声明
24: int myBSearch
25: (
26: const void* _Base,
27: const void* _Key,
28: int _NumOfElements,
29: size_t _SizeOfElement,
30: int _ptFuncCompare(const void*, const void*)
31: );
32:
33: int cmp(const void* _elementA,const void* _elementB);
34: //----------------------------------------------------------
35:
36: int main()
37: { 38: int k[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; 39: int p = 16;
40: printf("Index At: %d\n",BSEARCH_ARY(k, &p, cmp)); 41:
42: _getch();
43: return 0;
44: }
45: //-----------------------------------------------------------
46: // 函数名称:
47: // myBSearch 算是非常简短的二分搜索
48: // 参数:
49: // - const void* _Base 数据基址
50: // - const void* _Key 查找目标
51: // - int _NumOfElements 元素数量
52: // - size_t _SizeOfElement 元素大小
53: // - int _PtFuncCompare(const void*, const void*) 比较函数
54: // 返回:
55: // int 以0为起始的元素索引,如果没找到元素则返回-1
56: // 说明:
57: //
58: //-----------------------------------------------------------
59: int myBSearch
60: (
61: const void* _Base,
62: const void* _Key,
63: int _NumOfElements,
64: size_t _SizeOfElement,
65: int _PtFuncCompare(const void*, const void*)
66: ){ 67: const char* base = (const char*) _Base;
68:
69: for (size_t lim = _NumOfElements; lim != 0; lim >>= 1)
70: { 71: const char* p = base + (lim >> 1) * _SizeOfElement;
72: int cmp = _PtFuncCompare(_Key, p);
73:
74: if (cmp == 0)
75: return ((p - (const char*)_Base) / _SizeOfElement);
76: if (cmp > 0)
77: { 78: base = (const char*)p + _SizeOfElement;
79: lim--;
80: }
81: }
82:
83: return (-1);
84: }
85:
86: //----------------------------------------------------------
87: // 实现一个比较函数
88: int cmp(const void* _elementA, const void* _elementB)
89: { 90: return (*(int*)_elementA - *(int*)_elementB);
91: }
92:
93: //----------------------------------------------------------