C ++中的Quicksort无限循环问题

时间:2014-03-30 23:21:03

标签: c++ infinite-loop quicksort

我已经对以下代码的交换和分区功能进行了广泛测试,它们似乎是正确的;但是,当我尝试执行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);
}

2 个答案:

答案 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函数,中,当然使用其结果的方式。分区函数应重新排序数组项,以使透视值落入其最终位置。然后递归调用在枢轴之前处理项目,在之后处理,但是枢轴本身不会在更深的递归级别中处理。这可以保证每个递归级别的数据量都会减少,因此递归必须在某个级别停止。