2017-07-12 27 views
0

我一直在努力在C中实现一个二进制搜索函数,它似乎在每种情况下工作,除了找到正在搜索的数组中的最后一个值。请任何人如此善意地指引我走向正确的方向。非常感谢!我知道这可能是一些糟糕和低效的代码,(我只有几天的时间,请原谅我!),所以我会在未来考虑你的所有指导。二进制搜索不返回数组中的最后一个值

bool search(int value, int values[], int n) 
{ 
int middle = (n/2); 
if (n < 0) 
{ 
    return false; 
} 

if (n < 2 && n > 0) 
{ 
    if (value == values[0]) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

const int MAX = 65536; 
int half[MAX]; 

if (value > values[middle]) 
{ 
    int new_size = n - middle - 1; 
    for (int i = 0, m = middle + 1; i < new_size; i++, m++) 
    { 
     half[i] = values[m]; 
    } 
    return search(value, half, new_size); 
    } 

else if (value < values[middle]) 
{ 
    int new_size = n - middle; 
    for (int i = 0, m = 0; i < middle; i++, m++) 
    { 
     half[i] = values[m]; 
    } 
    return search(value, half, new_size); 
} 

else if (value == values[middle]) 
{ 
    return true; 
} 
return false; 
} 

void sort(int values[], int n) 
{ 
int swap; 

for (int i = 0; i < n; i++) 
{ 
    for (int j = 0; j < n; j++) 
    { 
     if (values[j] > values[j + 1]) 
     { 
      swap = values[j + 1]; 
      values[j + 1] = values [j]; 
      values[j] = swap; 
     } 
    } 
} 
} 
+2

这个算法效率非常低。为什么每次都需要一个新的阵列?你可以保留两个指针到数组的开始和结束处,并根据需要改变它们! –

+1

在这种情况下使用调试器非常有用。 – Rohan

+1

1)'int new_size = n - middle;' - >'int new_size = middle;' – BLUEPIXY

回答

0

在您的排序函数的索引出界外的错误可能发生: for循环更改内部到:

for(j =0; j < n-1; j++) 

我的解释是,在你的排序功能,您试图实现冒泡排序算法,它的正确实现是:

void sort(int a[], int n){ 
    int i,j,temp; 
    for(i =0; i < n-1; i++){ 
    for(j =0; j < n-1-i; j++){ 
     if(a[j] > a[j+1]){ 
      temp = a[j]; 
      a[j] = a[j+1]; 
      a[j+1] = temp; 
     } 
    } 
    } 
} 
+0

非常感谢您的指导Amrender!使用你的建议,以及大声调试,我能够实现工作。 –

+0

@RizwanShirazi如果答案可以接受,请将其标记为已接受,否则此问题将保持打开状态。 –