关于我天真的快速排序算法的快速(哈哈哈)问题:
#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);
}
}
当我在测试数组上运行代码时,似乎只有数组的左侧(小于侧面)被排序,并且从不跳转到右侧排序并创建无限循环。
在运行代码之前发出一点警告,有时候当我在测试阵列上运行代码时它会冻结我的机器。
无论如何,谢谢你的帮助!此外,这不适用于家庭作业(什么类的排序算法要求您立即学习快速排序?)
答案 0 :(得分:1)
我会用一个问题回答你的问题。
如何处理start == end?
时调用方法的情况每次运行都会绕着枢轴划分你的子部分,所以每次递归运行,你都有上一次的长度的1/2。所以你先排序前半部分,然后是前1/4,然后是前1/8。最后,你将使用start = end = 0来调用方法。这使得0 - 0/2成为枢轴,即0。
通过您的代码运行该案例,您将看到您没有处理您的方法尝试自己对一个条目进行排序的情况。它将陷入无限递归循环,直到它崩溃...
Stack Overflow。
答案 1 :(得分:0)
你可能想看看你对'='的使用。我相信你可以在与轴心点比较时使用&gt; =和&lt; =但是在进行交换时不需要它。
然后踢球者是递归调用 - 你肯定不想在那里使用=,我认为这是无限递归的原因,最终会崩溃,因为j永远不会小于开始。所以基本上每次与=进行比较,删除它,并且每次比较没有=,添加一个。