为什么“middle = arr [(beg + end)/ 2]”出错?

时间:2016-03-30 08:10:46

标签: c

我在c中实现quick_select,但我的代码出错了,我花了很长时间才找出原因,但我仍然无法理解。

函数get_pivot是为quick_select找到一个支点,这里是错误的代码:

int get_pivot(int*arr, int beg, int end)
{

    int middle = arr[(beg + end) / 2];                    
    if (middle < arr[beg])
      swap(&middle, &arr[beg]);
    if (arr[end] < arr[beg])
      swap(&arr[beg], &arr[end]);
    if (middle>arr[end])
      swap(&middle, &arr[end]);
    swap(&middle, &arr[end - 1]);
    return arr[end - 1];
}

此功能旨在找出中间数字3并将枢轴移动到最后。

然而,它出错了(我的意思是quick_select输出未排序数组),直到我用int middle = arr[(beg + end) / 2];替换int middle=(beg+end)/2 arr[middle]并使用middle代替int get_pivot(int*arr, int beg, int end) { int middle = (beg + end) / 2; if (arr[middle] < arr[beg]) swap(&arr[middle], &arr[beg]); if (arr[end] < arr[beg]) swap(&arr[beg], &arr[end]); if (arr[middle]>arr[end]) swap(&arr[middle], &arr[end]); //hide pivot swap(&arr[middle], &arr[end - 1]); return arr[end - 1]; } 。这是正确的代码:

int middle = arr[(beg + end) / 2];

我不明白为什么item.wert出错了。

我真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

因为这条线路出错了(以后会有类似的)

swap(&middle, &arr[beg]);

middle是一个单独的变量,当您使用上述方式进行交换时,数组中的实际元素(array[middle])不会被交换(您需要)。

您想要交换数组的索引begmiddle中的元素。这可以通过

来实现
swap(&arr[middle], &arr[beg]);