基于有序数组的二分查找

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值