我的快速配置实施有什么问题?

时间:2014-01-17 15:40:38

标签: c++ sorting

关于我天真的快速排序算法的快速(哈哈哈)问题:

#include <iostream>

template <class T>
void quicksort2(T array[] , int start, int end){
  int i = start;
  int j = end;
  int temp;
  int pivot = (end - start) / 2;

  // Partioning
  while(i <= j){

    while(array[i] < array[pivot]){
      i++;
    }
    while(array[j] > array[pivot]){
      j--;
    }

    if( i <= j){
      temp = array[i];
      array[i] = array[j];
      array[j] = temp;
      i++;
      j--;
    }
  }

  // Sorting partions
  if(start <= j){
    quicksort2(array , start , j);
  }
  if(end >= i){
    quicksort2(array , i , end);
  }
}

当我在测试数组上运行代码时,似乎只有数组的左侧(小于侧面)被排序,并且从不跳转到右侧排序并创建无限循环。

在运行代码之前发出一点警告,有时候当我在测试阵列上运行代码时它会冻结我的机器。

无论如何,谢谢你的帮助!此外,这不适用于家庭作业(什么类的排序算法要求您立即学习快速排序?)

2 个答案:

答案 0 :(得分:1)

我会用一个问题回答你的问题。

如何处理start == end?

时调用方法的情况

每次运行都会绕着枢轴划分你的子部分,所以每次递归运行,你都有上一次的长度的1/2。所以你先排序前半部分,然后是前1/4,然后是前1/8。最后,你将使用start = end = 0来调用方法。这使得0 - 0/2成为枢轴,即0。

通过您的代码运行该案例,您将看到您没有处理您的方法尝试自己对一个条目进行排序的情况。它将陷入无限递归循环,直到它崩溃...

Stack Overflow。

答案 1 :(得分:0)

你可能想看看你对'='的使用。我相信你可以在与轴心点比较时使用&gt; =和&lt; =但是在进行交换时不需要它。

然后踢球者是递归调用 - 你肯定不想在那里使用=,我认为这是无限递归的原因,最终会崩溃,因为j永远不会小于开始。所以基本上每次与=进行比较,删除它,并且每次比较没有=,添加一个。