簡體   English   中英

C ++二進制搜索算法像Lower_bound一樣工作

[英]C++ Binary search algorithm to work like lower_bound

我之前有另一個問題-

我正在使用類似二進制搜索的方法創建一個lower_bound版本。 使用BinarySearch函數,我找到了一個插入新項目的地方,使用for循環,我確實移動了數組的其余部分並插入了正確的項目,以便可以將其插入到正確的位置。

但是以下BinarySearch函數無法正常工作。

誰能看到原因?

bool CReg::AddCar ( const char *name){
    CArr * tmp = new CArr(name); // an item I am going to insert
    int pos = BinarySearch(name,0,len); //len = number of items in array
    checkLen(); // whether I do have enough space to move the array right
    if (length!=0)
        for (int i = m_len; i>=pos; i-- )
            Arr[i+1] = spzArr[i];
    Arr[pos] = tmp;
    length++;
    checkLen();
    return true;
}

int BinarySearch(const char * name, int firstindex, int lastindex) {
    if (lenght == 0) return 0; //number of items in array
    if (firstindex == lastindex) return lastindex;
    int tmp = lastindex - firstindex;
    int pos = firstindex + tmp / 2; //position the new item should go to
    if (tmp % 2)++pos;
    if (lastindex == pos || firstindex == pos) return pos;
    if (strcmp(name, Arr[pos]) < 0) return BinarySearch(name, firstindex, pos - 1);
    if (strcmp(name, Arr[pos]) > 0) return BinarySearch(name, pos + 1, lastindex);
    return pos;
    }

固定版本的BinarySearch

int BinarySearch(const char* name, int firstindex, int lastindex)
{
    if (firstindex == lastindex) return lastindex;
    int dist = lastindex - firstindex;
    int mid = firstindex + dist / 2; //position the new item should go to
    if (strcmp(name, Arr[mid]) < 0) return BinarySearch(name, firstindex, mid);
    if (strcmp(name, Arr[mid]) > 0) return BinarySearch(name, mid + 1, lastindex);
    return mid;
}

但是您可以直接使用std::lower_bound

// Assuming std::vector<std::string> Arr;

void CReg::AddCar(const std::string& name)
{
    auto it = std::lower_bound(Arr.begin(), Arr.end(), name);
    Arr.insert(it, name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM