基于有序数组的二分查找

来源:互联网 发布:天梭手表怎么样 知乎 编辑:程序博客网 时间:2024/04/26 07:04
#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的字典项值,如果没有匹配项,则返回-1int 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;}

0 0
原创粉丝点击