我在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
出错了。
我真的很感谢你的帮助!
答案 0 :(得分:2)
因为这条线路出错了(以后会有类似的)
swap(&middle, &arr[beg]);
middle
是一个单独的变量,当您使用上述方式进行交换时,数组中的实际元素(array[middle]
)不会被交换(您需要)。
您想要交换数组的索引beg
和middle
中的元素。这可以通过
swap(&arr[middle], &arr[beg]);