我在使用tail recursive版本的quicksort这里是我的代码
#include <iostream>
using namespace std;
int partition(int a[],int l,int r){
int pivot=a[l];
std::swap(a[pivot],a[r]);
int store=l;
for (int i=l;i<r;i++){
if (a[i]<=pivot){
std::swap(a[i],a[store]);
store=store+1;
std::swap(a[store],a[r]);
}
}
return store;
}
void tail_quick(int a[],int p,int r){
while(p<r){
int q=partition(a,p,r);
tail_quick(a,p,q-1);
p=q+1;
}
}
int main(){
int a[]={21,10,13,8,56,9,34,11,22,44};
int n=sizeof(a)/sizeof(int);
tail_quick(a,0,n-1);
for (int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
但是输出不正确没有排序,并且还有一些randome数字输出请帮助
答案 0 :(得分:0)
您在以下partition
的通话中使用了未初始化的变量。你确定这不应该是别的吗?
void tail_quick(int a[],int p,int r){
while(p<r){
int q=partition(a,p,q); // <--- uninitialized variable "q"
tail_quick(a,p,q-1);
p=q+1;
}
}
答案 1 :(得分:0)
你有几个问题。
首先,在partition()中,您已将pivot INDEX与pivot VALUE混淆。 VALUE应该用于比较,并且初始的pivot INDEX应该用于交换。由于您使用第一个元素作为枢轴(不是性能最佳),因此您应该将第一个交换更改为使用“l”而不是“pivot”。请注意,您使用数组的第一个值作为索引。
接下来,“最终”交换应该在for循环之外完成,而不是在每次迭代时完成。因此,您的partition()函数应如下所示:
int partition(int a[],int l,int r){
int pivot=a[l];
std::swap(a[l],a[r]);
int store=l;
for (int i=l;i<r;i++){
if (a[i]<=pivot){
std::swap(a[i],a[store]);
store=store+1;
}
}
std::swap(a[store],a[r]);
return store;
}
你的tail_quick()函数可以正常工作,但只需进行两次递归调用就更好了......
void tail_quick(int a[],int p,int r){
if (p < r){
int q=partition(a,p,r);
tail_quick(a,p,q-1);
tail_quick(a,q+1,r);
}
}
但是,您应该使用标准库,因为它会为您提供正确的答案并提供最佳性能。