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

纽斯科勒

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

我使用了这个堆栈溢出问题(特别是Marius的答案)作为参考指南,但是我现在坚持使用我的代码,并且不知道问题出在哪里。我正在运行C ++ 03。

我得到的错误之一是

error: invalid types ‘const float*[float]’ for array subscript’ for array subscript在我的if声明中。

//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不是float,因此您需要返回一个vector<size_t>非a vector<float>

那就是说你的排序是O(n 2如果您愿意使用更多的内存,我们可以将时间减少到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

编辑:

是的,当使用avector<float>而不是a时,实际上实际上会更简单一些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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在c ++中对向量进行排序

如何在不使用boost或创建模板的情况下在c ++中同时对两个向量进行排序?

在C ++ 11中使用std :: sort和lambda函数对动态分配的多维C数组进行排序

在C ++中对向量进行排序

如何在c ++中对向量数组进行排序?

在C ++中对向量进行向量排序

如何在C ++ 11中返回类成员向量

如何在CLion中启用C ++ 11?

如何在C ++ 11中终止线程?

如何在gcc中启用C ++ 11?

如何在CMake中激活C ++ 11?

C ++ 11,如何在#if中使用const

如何在g ++中使用C ++ 11?

C ++:如何在不使用算法库中排序功能的情况下按字母顺序对字符串向量进行排序

在C ++中对共享指针的向量进行排序

在C ++中使用向量对进行排序

使用STL C ++对向量对进行排序

如何在不使用标准算法的情况下将c元素添加到排序向量中?

如何才能静态断言std :: array类成员在c ++ 11中进行排序?

如何在C ++中对数组进行排序和检查?

如何在C ++ 11中的向量中查找和更新一个嵌套结构

如何在C ++ 11 Future中多次使用get()或如何获取向量值?

如何在SQL中不使用“ ORDER BY”对升序进行排序

如何在不使用插入排序更改原始向量的情况下对二维向量进行排序

C:如何对结构中的值进行排序和子排序

在向量 c++ 中按值对向量进行排序

C ++对向量向量中的多列进行排序

对结构向量进行排序C ++

如何在C ++ 11,C ++ 11、14和17之前的版本中简化复杂的SFINAE语法?