所以,这是我的排序算法。输出是:
0,2,3,3,2,1,4,6,10,12,12,5,15,21,21,15,22,32,26,29,...
它很接近,但在我无法找到的地方有一个错误。每第6个数字都是错误的。
我的矢量长度是20000.所以我调用函数
quickSort(a,0,20000); //(I think it is support to be 0,20000, but I am not sure though..)
我认为这是正确的,但不确定。
template <typename Comparable>
const Comparable& median3(vector<Comparable>& a, int left, int right){
int center=(left+right)/2;
if(a[center]<a[left]){
swap(a[center],a[left]);
}
if(a[right]<a[left]){
swap(a[right],a[left]);
}
if(a[right]<a[center]){
swap(a[right],a[center]);
}
swap(a[center],a[right-1]);
return a[right-1];
}
template <typename Comparable>
void quickSort(vector<Comparable>& a, int left = 0, int right = 20000){
if(left+10 <= right){
const Comparable& pivot = median3(a,left,right);
int i=left;
int j=right-1;
for(;;){
while(a[++i] < pivot){}
while(pivot < a[--j]){}
if(i<j){
swap(a[i],a[j]);
}else{
break;
}
}
swap(a[i], a[right-1]);
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
else{
//
}
}
答案 0 :(得分:0)
这一行:
if(left+10 <= right){
对我毫无意义。从本质上讲,您的例行程序并不打算对10个元素以下的子列表进行排序。
为什么呢?它是一个递归算法,需要排序到2个项目的列表才能正确完成。
正如我在评论中所说,测试从小到大的递归算法。 错误会很快弹出。