您的位置:首页 > 其它

查找-二分查找(3种实现版本)

2016-04-12 18:07 323 查看
二分查找(3种实现版本)

二分查找,又称为折半查找, 一次砍一半的思想,这里概念就不多说了,直接上代码吧。

1.数组版本
//二分查找数组实现,速度没有指针快
char* binary_search_str_1(char* cmd[], int n, char* key_str)
{
int low = 0;
int high = n;
int mid = 0;
int res = 0;
while (low < high)
{
//mid = low + (high - low) / 2;
mid = (high + low) >> 1;//移位效率高
res = strcmp(cmd[mid], key_str);//比较结果
if (res < 0)
{
low = mid + 1;//不对称边界,低位加1
}
if (res > 0)
{
high = mid;//不对称边界,高位不加1
}
if (0 == res)
{
return cmd[mid];
}
}
return NULL;
}


2.指针版本

//二分查找指针实现,速度快
char* binary_search_str_2(char* cmd[], int n, char* key_str)
{

char** low = cmd;
char** high = cmd + n;
char** mid = NULL;
int res = 0;

while (low < high)
{
mid = low + ((high - low) >> 1);//指针没有加法
res = strcmp(*mid, key_str);//比较结果
if (res < 0)
{
low = mid + 1;
}
if (res > 0)
{
high = mid;
}
if (0 == res)
{
return *mid;
}
}
return NULL;
}


3.数组递归版本

//数组递归实现二分查找
char* binary_search_str_3(char* cmd[], int n, char* key_str)
{
static int low = 0;
static int high = 10;//数组长度
static int mid = 0;

if (low >= high)//结束条件
{
return NULL;
}
else
{
mid = (high + low) >> 1;//移位效率高
int res = strcmp(cmd[mid], key_str);//比较结果
if (res < 0)
{
low = mid + 1;//不对称边界,低位加1
return binary_search_str_3(cmd, n, key_str);
}
if (res > 0)
{
high = mid;//不对称边界,高位不加1
return binary_search_str_3(cmd, n, key_str);
}
if (0 == res)//相等直接返回
{
return cmd[mid];
}
}
}


4.main来测试一下排序字符串

int main(void)
{
//我们加大难度,来对字符串排序
char *cmd[10] = { "calc", "1234", "abcd", "ak47", "AMP", "M16", "notepad", "tasklist", "run", "mspaint" };

//数组实现
putchar('\n');
puts(binary_search_str_1(cmd, 10, "tasklist"));

//指针实现
putchar('\n');
puts(binary_search_str_2(cmd, 10, "notepad"));

//数组递归实现
putchar('\n');
puts(binary_search_str_3(cmd, 10, "1234"));
system("pause");
return 0;
}


欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: