Quicksort算法在一些迭代后就地崩溃

时间:2014-04-30 16:48:15

标签: c algorithm quicksort

我已经实现了以下快速排序算法来对几对点(3D空间)进行排序。 每对夫妇都定义一条线:目的是将所有距离小于或等于powR的线放置在包含所有耦合的数组内。 包含坐标的数组是单维的,每6个元素定义一对,每3个点。

当我在处理2799222尝试进入下一次迭代后运行具有3099642个数组的算法的算法时停止。如果我从元素2799228开始算法,它将停在3066300。 我无法弄清楚问题在哪里,建议?

void QuickSort(float *array, int from, int to, float powR){

float pivot[6];
float temp[6];

float x1;
float y1;
float z1;
float x2;
float y2;
float z2;
float d12;

int i;
int j;

if(from >= to)
    return;

pivot[0] = array[from+0];
pivot[1] = array[from+1];
pivot[2] = array[from+2];
pivot[3] = array[from+3];
pivot[4] = array[from+4];
pivot[5] = array[from+5];

i = from;

for(j = from+6; j <= to; j += 6){

    x1 = pivot[0] - array[j+0];
    y1 = pivot[1] - array[j+1];
    z1 = pivot[2] - array[j+2];
    x2 = pivot[3] - array[j+3];
    y2 = pivot[4] - array[j+4];
    z2 = pivot[5] - array[j+5];
    d12 = (x1*x1 + y1*y1 + z1*z1) + (x2*x2 + y2*y2 + z2*z2);
/*the sorting condition i am using is the regular euclidean norm*/
    if (d12 <= powR){
                i += 6;

                temp[0] = array[i+0];
                temp[1] = array[i+1];
                temp[2] = array[i+2];
                temp[3] = array[i+3];
                temp[4] = array[i+4];
                temp[5] = array[i+5];

                array[i+0] = array[j+0];
                array[i+1] = array[j+1];
                array[i+2] = array[j+2];
                array[i+3] = array[j+3];
                array[i+4] = array[j+4];
                array[i+5] = array[j+5];

                array[j+0] = temp[0];
                array[j+1] = temp[1];
                array[j+2] = temp[2];
                array[j+3] = temp[3];
                array[j+4] = temp[4];
                array[j+5] = temp[5];
    }
}

QuickSort(array, i+6, to, powR);
}
以这种方式调用

函数:     float LORs =(float )calloc((unsigned)tot,sizeof(float));

LORs已填充从文件中读取数据,并且工作正常。

QuickSort(LORs, 0, 6000, powR);

    free(LORs);

1 个答案:

答案 0 :(得分:1)

for(j = from+6; j <= to; j += 6) {
    array[i+0] = array[j+0];
    array[i+1] = array[j+1];
    array[i+2] = array[j+2];
    array[i+3] = array[j+3];
    array[i+4] = array[j+4];
    array[i+5] = array[j+5];
}

当您接近结束时,j + constant_numberout of bounds。这就是它最终崩溃的原因。请注意,constant_number是非负数。

j接近时(通过增量步骤可以找到多近接近,即+6)到数组的末尾,它肯定会超出界限。

采用简单的情况,最大值j可以获得。这是你的数组的大小。 所以,我们称之为N。

然后,当 j等于N 时,您将进入循环。

然后,您要访问array[j + 0],实际为array[N + 0],即array[N]

我很确定,你知道C中的索引(你将来应该包含在你的问题的标签中)是从0到N - 1.依此类推..

编辑:正如评论所示,这不是一个(快速)排序!

我已经实现了quickSort here,您是否想要了解它。我建议你从解释开始,而不是从代码开始!