我已经对以下代码的交换和分区功能进行了广泛测试,它们似乎是正确的;但是,当我尝试执行quicksort时,它会进入无限循环。我假设问题是从我在分区中返回的值发生的,但我不完全确定它是什么。
void swap_G(int *begin, int *end)
{
int temp = *begin;
*begin = *end;
*end = temp;
return;
}
int* partition(int* begin, int* end)
{
if (begin >= end) {
return begin;
}
int pivot = *end;
int* temp_Begin = begin, *temp_End = end;
temp_End--;
while (temp_Begin < temp_End)
{
while (*temp_Begin < pivot && temp_Begin < temp_End)
{
temp_Begin++;
}
while (*temp_End > pivot && temp_End > temp_Begin)
{
temp_End--;
}
swap_G(temp_Begin, temp_End);
}
swap_G(end, temp_Begin);
return temp_Begin;
}
void quicksort_G(int* begin, int* end)
{
if (begin >= end)
{
return;
}
int* mid = partition(begin, end);
quicksort_G(begin, --mid);
quicksort_G(mid + 1, end);
}
答案 0 :(得分:0)
使用所有指针的任何理由?我看到的问题是中期
int* mid = partition(begin, end);
quicksort_G(begin, --mid)
这会将指针递减到mid。例如:
int* temp = new int( 6 );
std::cout << *temp << std::endl;
std::cout << *(--temp) << std::endl;
你会得到
6
-33686019
打印内存地址会产生
std::cout << temp << std::endl;
std::cout << (--temp) << std::endl;
00BE48B0
00BE48AC//Decremented by sizeof(int). Garbage data
我会看看我是否可以完全摆脱指针。你正在通过那个将在下一步中用作结束的中间位置。但在分区中,end将被交换。所以当你从第一个递归步骤返回时,mid已经搞砸了。
答案 1 :(得分:0)
问题可能出在partition
函数,和中,当然使用其结果的方式。分区函数应重新排序数组项,以使透视值落入其最终位置。然后递归调用在枢轴之前处理项目,在之后处理,但是枢轴本身不会在更深的递归级别中处理。这可以保证每个递归级别的数据量都会减少,因此递归必须在某个级别停止。