我已经在线提供了各种来源的快速排序,并使用了将枢轴放在中心的技术,而不像其他人那样使用了第一个或最后一个索引。
然而,排序最终会破坏我的程序超过80个元素,因为它只是冻结而我假设它是因为它对内存效率低下。
它尝试排序的数据绝不是已经排序和完全随机的。
void swapVecPos(int posOne, int posTwo)
{
int temp = intVec[posOne];
intVec[posOne] = intVec[posTwo];
intVec[posTwo] = temp;
}
void sortShit(int leftValue, int rightValue)
{
int left = leftValue;
int right = rightValue;
int pivot = intVec[(leftValue + rightValue) / 2];
while(left <= right)
{
while(intVec[left] < pivot)
{
left++;
}
while(intVec[right] > pivot)
{
right--;
}
if(left <= right)
{
swapVecPos(left, right);
left++;
right--;
}
}
if(leftValue < right)
sortShit(leftValue, right);
if(left < rightValue)
sortShit(left, intVec.size() - 1);
}
谢谢
答案 0 :(得分:2)
您的代码中有两个明显的错误。首先,如果在任何情况下 枢轴是最小值或最大值的时间(那个 如果值是随机的,将在某个时间发生,你离开 您正在处理的分区。如果分区是第一个 或者最后,这可能会导致未定义的行为,但在任何情况下 情况下,它不会给出正确的结果。
第二:当你再次递归时,第二次递归使用
intVect.size()
,所以它调用了所有内容的函数
遗迹。这肯定是您所看到的症状的原因。
答案 1 :(得分:1)
这一行错了:
sortShit(left, intVec.size() - 1);
递归的其他一些分支负责在rightValue+1
和intVec.size()-1
之间进行排序。您只需要使用
sortShit(left, rightValue);
恢复递归调用始终在较小的集合上的不变量,因此终止。
您的通话允许右手套的大小增加,因此不保证终止。