#define MAX_COUNT 100
//基于有序数组的二分查找
int keys[MAX_COUNT] = {0};
int values[MAX_COUNT] = {0};
int count = 0;
int isEmpty()
{
return count == 0;
}
//根据给定的关键字,在字典中查找是否有匹配项,并返回匹配的项的
//数组索引,如果没有找到匹配的项,则返回大于该关键字的项的索引,
//主要用于将新值插入到合适位置使用.
//比如当前关键字集为 3 7 9,当我要插入一个key为8,此时使用rank(key)
//应该返回2,则当前新的key值插入到数组索引2的位置.
int rank(int key)
{
int lo = 0;
int hi = count - 1;
while ( lo <= hi )
{
int mid = lo + (hi - lo) / 2;
if ( key < keys[mid] )
{
hi = mid - 1;
}
else if ( key > keys[mid] )
{
lo = mid + 1;
}
else
{
return mid;
}
}
return lo;
}
//获取匹配key的字典项值,如果没有匹配项,则返回-1
int get(int key)
{
int i = 0;
if ( isEmpty() )
{
return -1;
}
i = rank(key);
if ( i < count && keys[i] == key )
{
return values[i];
}
return -1;
}
//向字典插入新项,如果当前key值在字典中已经存在,则替换
//最新的字典项值,如果不存在,则将新项按序插入到合适的位置
void put(int key, int val)
{
int j = 0;
int i = rank(key);
if ( i < count && keys[i] == key )
{
values[i] = val;
return;
}
for ( j = count; j > i; j-- )
{
keys[j] = keys[j - 1];
values[j] = values[j - 1];
}
keys[i] = key;
values[i] = val;
count++;
}
int main(int argc, char *argv[])
{
int i = 0;
int findKey = 0;
int getVal = 0;
int keys[] = {2, 4, 6, 1, 9, 4, 9, 8, 7, 2};
int vals[] = {21, 41, 61, 11, 91, 42, 92, 81, 71, 22};
if ( argc != 2 )
{
printf("Usage: %s <findKey>\r\n", argv[0]);
return 0;
}
for ( i = 0; i < sizeof(keys)/sizeof(keys[0]); i++)
{
put(keys[i], vals[i]);
}
findKey = atoi(argv[1]);
getVal = get(findKey);
printf("key %d, val %d\r\n", findKey, getVal);
return 0;
}
基于有序数组的二分查找
最新推荐文章于 2022-04-10 12:53:12 发布