C ++排序升序非零值

时间:2016-12-16 14:35:04

标签: c++ arrays sorting

我对c ++有点生气,经过一天的思考,我不会想出一种有效的计算方法。

假设我有一个包含5个浮点值的数组

lints[5]={0, 0.5, 3, 0, 0.6};

我想介绍一个新的数组: ranks[5],其中包含数组lints的非0值的升序。

在这种情况下,答案将为

ranks[1]=0;

ranks[2]=1;

ranks[3]=3;

ranks[4]=0;

ranks[5]=2;

在这个例子中,0值返回秩0,但它们不相关,因为我只需要正值的等级。

提前致谢

编辑: 感谢大家的帮助,这是我发现适合我的需求,以防你有相同的任务:)

double lengths[5], ranks[5];
double temp;
int i,j;

lengths[0] = 2,lengths[1] = 0,lengths[2] = 1,lengths[3] = 0,lengths[4] = 4;
ranks[0] = 1, ranks[1] = 2, ranks[2] = 3, ranks[3] = 4, ranks[4] = 5;

for(i=0;i<4;i++){
    for(j=0;j<4-i;j++){
        if((lengths[j]>lengths[j+1] && lengths[j+1]) || lengths[j]==0){
            // swap lenghts
            temp=lengths[j];
            lengths[j]=lengths[j+1];
            lengths[j+1]=temp;
            // swap ranks
            temp=ranks[j];
            ranks[j]=ranks[j+1];
            ranks[j+1]=temp;
        } 
    }
}    

欢呼声。

3 个答案:

答案 0 :(得分:0)

您可以通过简单的添加使用任何排序算法。交换2个值时,您也可以交换索引值。

为初始索引创建索引值

ranks[5] = {1,2,3,4,5}; //or 0,1,2,3,4

for (int i = 0 ; i < 5 ; i++){
    for(int j = 0 ; j < 5 ; j++){
        //if array[i] < array[j]
        //swap array[i] - array[j]
        //swap ranks[i] - ranks[j]
    }
}

答案 1 :(得分:0)

正如@cokceken所说(我知道答案不应该引用其他答案,但是我没有足够高的Stack Overflow等级评论答案:/),使用任何简单的排序算法,只需添加在您自己的功能中,用于任何特殊情况,例如示例中的值0或负值。

例如,假设您实际上并不想对原始数组进行排序,只是创建一个新数组,将数组中的索引链接到它们的排序等级,

Jfield

(请注意,arraySize必须是值而不是变量,因为C ++不允许您静态定义具有可变大小的数组)

答案 2 :(得分:0)

如果你在一个类中保留值,原始位置和排名的单独值,我发现这更容易:

#include <vector>
#include <iostream>
#include <algorithm>

struct Item {
    float value;
    int original_position;
    int rank;
};

int main() {
    float lints[5] = {0, 0.5, 3, 0, 0.6};
    std::vector<Item> items{};
    int index{};
    for(auto i : lints)
        items.push_back(Item{i,index++,0}); // assign index to original_position
    std::sort(items.begin(), items.end(), [](auto& l, auto& r) {return l.value < r.value; }); // sort by float value
    auto it = std::find_if(items.begin(), items.end(), [](auto& i) {return i.value > 0; }); // find first non-zero position (as iterator)
    int new_rank_value{1}; // start numbering non-zero numbers from 1
    std::for_each(it, items.end(), [&new_rank_value](auto& i) {i.rank = new_rank_value++; }); // assign non-zero numbers a rank value
    std::sort(items.begin(), items.end(), [](auto& l, auto& r) {return l.original_position < r.original_position ; }); // sort by original position again
    for(auto i : items) 
        std::cout << "ranks[" << i.original_position << "]=" << i.rank << ";\n";
}

输出:

ranks[0]=0;
ranks[1]=1;
ranks[2]=3;
ranks[3]=0;
ranks[4]=2;