使用快速排序算法的类型问题

时间:2013-12-10 19:54:18

标签: c++ templates sorting types

我在使用迭代器模板的快速排序算法的实现中遇到了不同类型的问题,我无法弄清楚发生了什么。

算法如下:

template <typename I> void ordenacion_rapida(I i, I j, int n0=1)
{
    int n = j-i;

    if (n<=n0)
        ordenacion_insercion<I>(i, j);
    else
    {
        I p = pivote(i, j);
        ordenacion_rapida<I>(i, p);
        ordenacion_rapida<I>(p+1, j);
    }
}

template <typename I> I pivote(I i, I j)
{
    I p = i;
    typedef typename iterator_traits<I>::value_type tipo;
    tipo x = *(i);

    for (I k=i+1; k<j; ++k)
        if (*(k)<=x)
        {
            ++p;
            tipo aux = *(p);
            *(p) = *(k);
            *(k) = aux;
        }
    *(i) = *(p);
    *(p) = x;
}

template <typename I> void ordenacion_insercion(I i, I j)
{
    typedef typename iterator_traits<I>::value_type tipo;
    for (I k=i+1; k<j; ++k)
    {
        tipo x = *(k);
        while (k!=i && x<*(k-1))
        {
            *(k) = *(k-1);
            --k;
        }
        *(k) = x;
    }
}

请原谅我,如果有大量的代码,但问题可能在任何一行,我已经详尽地分析了。

问题在于,当我尝试对vector<doublevector<float>进行排序时,我报告错误,而在使用vector<int>时没有出现此问题。

问题出在哪里?

1 个答案:

答案 0 :(得分:2)

我无法看到您的代码有任何问题,它完全正常。唯一的问题是你忘了在pivote内找回一些内容。

#include <iterator>
#include <vector>
using namespace std;

template <typename I> void ordenacion_insercion(I i, I j)
{
    // snip
}

template <typename I> I pivote(I i, I j)
{
    // snip

    // Assuming you intended to return P
    return p;
}

template <typename I> void ordenacion_rapida(I i, I j, int n0=1)
{
    // snip
}

#include <iostream>

int main() {
    std::vector<double> v = { 1.2f, 0.5f, 3.5f, 0.2f };
    ordenacion_rapida(v.begin(), v.end());
    for (unsigned int i = 0; i < v.size(); i++)
        std::cout << v[i] << " ";
} // 0.2 0.5 1.2 3.5