使用快速排序的数组版本对矢量进行排序

时间:2017-07-04 08:33:27

标签: c++ sorting quicksort

我正在使用OpengGL编写一个简单的渲染引擎,我编写了一个管理粒子系统的类。该类创建粒子并将它们推入矢量以供渲染器用于在屏幕上绘制它们。我需要从最远到最近的相机订购粒子(为了解决alpha混合和深度问题),所以我尝试使用以下代码:

void ParticleRenderer::sortParticles(Particle **particles, int low, int high)
{
    if (low >= high)
        return;
    Particle *temp = particles[low];
    while (true)
    {
        while (compareParticles(temp, particles[high]) >= 0 && low < high)
            high--;
        if (low == high)
            break;
        else
            particles[low++] = particles[high];
        while (compareParticles(temp, particles[low]) < 0 && low < high)
            low++;
        if (low == high)
            break;
        else
            particles[high--] = particles[low];
    }
    particles[high] = temp;
    int middle = high;
    sortParticles(particles, low, middle - 1);
    sortParticles(particles, middle + 1, high);
}

double ParticleRenderer::compareParticles(Particle *particle1, Particle *particle2)
{
    return  getCameraDistance(particle1) - getCameraDistance(particle2);
}

double ParticleRenderer::getCameraDistance(Particle *particle)
{
    glm::vec3 distance = mCamera.getPosition() - particle->getPosition();
    return glm::length(distance);
}

以下代码用于测试排序:

sortParticles(&mParticles[0], 0, mParticles.size() - 1);

for (Particle *particle : mParticles)
    std::cout << getCameraDistance(particle) << std::endl;

我在控制台上获得的是所有未分类的粒子。有人可以解释为什么排序不起作用吗?

1 个答案:

答案 0 :(得分:-1)

实际上我的递归快速排序是错误的。在使用int的向量进行测试时,我使用了稍微不同的版本,其中在另一个函数中执行了数组的分区。这个版本是有缺陷的,因为我传递给递归快速排序(分而治之,我理解......)算法中使用的相同的高和低索引...所以我传递相同的索引。 ..没有排序。