//通用二分查找
//key带查找的key
//base数组的起始地址 (数组必须为已序)
//count数组元素个数
//vsize 一个元素内存大小
//equ == 1 equ为1时, 返回找到等于key的索引, equ为0时, 找到第一个小于key的值
//compar用户自定义函数 compar返回 < 0 key < mid , = 0找到 , > 0 key > mid
int BSearch(void* key,const void* base ,int count,int vsize, int& equ, int (*compar)(const void* vale1,const void* vale2) )
{
int mid,low,h;
const void* pmid = NULL;
low = 0;
h = count;
int com = 0;
while (low < h)
{
mid = (low + h) / 2;
pmid = (void*)((const char*) base + (mid * vsize));
com = (*compar)(key,pmid);
if (0 == com)
{
equ = 1;
return mid;
}
else if(com < 0)
{
h = mid - 1;
}
else
{
low = mid + 1;
}
}
return 1;
}
//通用排序
int CompareintType(void* p1,void* p2)
{
int* el1 = (int*)p1;
int* el2 = (int*)p2;
if (*el1 > *el2)
{
return 1;
}
else if (*el1 < *el2)
{
return -1;
}
return 0;
}
//升序
typedef int (*Compare)(void* p1,void* p2);
void CommonSort(char* arraypoint,unsigned int size,unsigned int sizebyte,Compare pFunc)
{
char* tmp = new char[sizebyte];
for (int i = 0;i < size; ++i)
{
for (int j= i + 1;j < size; ++j)
{
char* point1 = (arraypoint + i * sizebyte);
char* point2 = (arraypoint + j * sizebyte);
if ((*pFunc)((void*)point1,(void*)point2) > 0)
{
//swap
memcpy(tmp,point1,sizebyte);
memcpy(point1,point2,sizebyte);
memcpy(point2,tmp,sizebyte);
}
}
}
delete[] tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
int ary [9] = {100,20,5,130,55,21,8,8,99};
CommonSort((char*)ary,9,sizeof(int),CompareintType);
for (int i = 0;i < 9 ;++i)
{
std::cout << ary[i] << " ";
}
return 0;
}
游戏后台里的通用技术之二分查找和排序
最新推荐文章于 2021-09-18 16:00:57 发布