如何在C中对向量排序和排序(不使用C 11)

我正在尝试构造一个函数,它接受一个向量,对其进行排序,排序,然后输出具有值原始位置的排序和排序向量.例如:输入:[10,332,42,0.9,0]输出:[3,5,4,2,1]

我使用了该堆栈溢出question(特别是Marius的答案)作为参考指南,但是我现在仍停留在代码中,不知道问题出在哪里.
我正在运行C 03.

我得到的错误之一是

错误:如果我的if语句中的数组下标的类型为“数组下标的类型为const float * [float]”,

//Rank the values in a vector
std::vector<float> rankSort(const float *v_temp, size_t size)
{
    vector <float> v_sort;
    //create a new array with increasing values from 0 to n-1
    for(unsigned i = 0; i < size; i++)
    {
        v_sort.push_back(i);
    }
    bool swapped = false;
    do
    {
        for(unsigned i = 0; i < size; i++)
        {
            if(v_temp[v_sort[i]] > v_temp[v_sort[i+1]]) //error line
            {
                float temp = v_sort[i];
                v_sort[i] = v_sort[i+1];
                v_sort[i+1] = temp;
                swapped = true;
            }
        }
    }
    while(swapped);
    return v_sort;
}

std::vector<float> rankSort(const std::vector<float> &v_temp)
{
    return rankSort(&v_temp[0], v_temp.size());
}

解决方法:

您的问题是对排名的误解.数组索引的大小为size_t,而不是浮点数,因此您需要返回一个vector< size_t>不是向量浮点数.

也就是说,您的排序是O(n2).如果您愿意使用更多的内存,我们可以将时间减少到O(n log(n)):

vector<size_t> rankSort(const float* v_temp, const size_t size) {
    vector<pair<float, size_t> > v_sort(size);

    for (size_t i = 0U; i < size; ++i) {
        v_sort[i] = make_pair(v_temp[i], i);
    }

    sort(v_sort.begin(), v_sort.end());

    pair<double, size_t> rank;
    vector<size_t> result(size);

    for (size_t i = 0U; i < size; ++i) {
        if (v_sort[i].first != rank.first) {
            rank = make_pair(v_sort[i].first, i);
        }
        result[v_sort[i].second] = rank.second;
    }
    return result;
}

Live Example

编辑:

是的,当取向量< float>时,实际上实际上会更简单一些.而不是float []:

vector<size_t> rankSort(const vector<float>& v_temp) {
    vector<pair<float, size_t> > v_sort(v_temp.size());

    for (size_t i = 0U; i < v_sort.size(); ++i) {
        v_sort[i] = make_pair(v_temp[i], i);
    }

    sort(v_sort.begin(), v_sort.end());

    pair<double, size_t> rank;
    vector<size_t> result(v_temp.size());

    for (size_t i = 0U; i < v_sort.size(); ++i) {
        if (v_sort[i].first != rank.first) {
            rank = make_pair(v_sort[i].first, i);
        }
        result[v_sort[i].second] = rank.second;
    }
    return result;
}

Live Example

上一篇:如何找出mysql中索引的大小(包括主键)


下一篇:python-熊猫:选择两个日期之间的DataFrame行(日期时间索引)