2014年1月14日 星期二

005 整數陣列搜尋大法 (找碴篇)

大家來找碴之 Code Review 好好玩

  試想一個情境,同事A被要求撰寫一個小模組,規格如下
在一個整數陣列中搜尋特定整數;
若尋得,返回該值位於陣列中的位移值;
若無得,返回-1
  因此,同事A花了幾分鐘,寫出了以下這幾段程式碼,並且很貼心的提供兩種search實作方式,給一般人使用的while 版本 (binarySearch_int) 或給神人使用的 recursive 版本  (binarySearch_int_R).

  現在問題來了,本團隊有採用 Code Review + Code Inspection 的習慣;現在請模擬你正處在會議室中,你是否有能力透過人腦編譯器你的專業能力,找出程式碼中可能有的問題或給予其他實質的建議?

  好孩子請跟我一起宣誓:在code review期間,除了使用人腦編譯器外,我發誓絕不偷偷把程式碼貼上IDE編譯執行;並且我將秉持人飢己飢人溺己溺,同事出包就如同我出包,的精神,認真並負責的審查程式碼,決不胡亂使用 LGTM大法

  雖然說我猜不會有人回復,但還是假裝一下:一周後開獎,提出最有價值的修正或建議的網友,阿宅工程師可以請補休跟你一齊吃霜淇淋(第一支我請客),探討人生哲學或測試學.


void swap_int(int* pa, int* pb)
{
    *pa = *pa xor *pb;
    *pb = *pa xor *pb;
    *pa = *pa xor *pb;
}

void selectionSort_int(int list[], int isize)
{
    int imini_index = 0;
    for (int i=0; i<isize-1; i++)
    {
        imini_index = i;
        for(int j=i+1; j<isize; j++)
        {
            if (list[j] < list[imini_index])
            {
                imini_index = j;
            }
        }
        if (imini_index != i) { swap_int(&list[i],&list[imini_index]); }
    }
}

int binarySearch_int(int target[], int toFind, int isize)
{
    if (NULL == target) { return -1; }

    int ileft = 0; int iright = isize-1;
    while(ileft < iright)
    {
        int imid_index = (iright + ileft) / 2;
        if (target[imid_index] > toFind)
        {
            iright = imid_index - 1;
        }
        else if (target[imid_index] < toFind)
        {
            ileft = imid_index +1;
        }
        else { return imid_index; }
    }
    return -1;
}

int compare_int(int iop1, int iop2)
{
    return (iop1>iop2?1:
            (iop1==iop2?0:-1));
}

int binarySearch_int_R(int target[], int toFind, size_t ileft, size_t iright)
{
    if (NULL == target || ileft > iright) { return -1; }

    int imid = (ileft + iright) / 2;
    switch( compare_int(toFind,target[imid]) )
    {
        case 0:
        { return imid; }
        case 1:
        {
            return binarySearch_int_R(target,
                                      toFind,
                                      imid+1,
                                      iright);
        }
        case -1:
        {
            return binarySearch_int_R(target,
                                      toFind,
                                      ileft,
                                      imid  -1);
        }
        default:
        { fprintf(stderr, "WARM: unexpected on compare_int()\n"); } break;
    }
    return -1;
}


沒有留言:

張貼留言