C++按升序排列的非零值
我用C++有点生疏,经过一天的思考,我没有找到一种有效的计算这个问题的方法。C++按升序排列的非零值
假设我有5浮子的值的数组
lints[5]={0, 0.5, 3, 0, 0.6};
我想介绍一个新的数组: ranks[5]
包含数组绒毛的非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;
}
}
}
欢呼。
您可以使用任何排序算法和一个简单的添加。当交换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]
}
}
谢谢您的回复,但是,我认为您的解决方案也会排序0值。我希望代码要么忽略它们,要么将它们排在最后。 –
你可以编写你的逻辑。只需更换交换部分 – cokceken
创建索引值@cokceken说(我知道答案不应该参考其他的答案,但我不是一个足够高的堆栈溢出排名上回答评论:/) ,使用任何简单的排序算法,并且只需添加您自己的功能以用于任何特殊情况,例如您的示例中的值为0或负值。
例如,假设你实际上并不希望将原来的数组进行排序,只是创建一个新的数组,数组这些分类排名中的链接索引,
array[arraySize] = // insert array here;
ranks[arraySize];
for (int i = 0; i < arraySize; i++){
int indexRank = 0;
for (int j = 0; j < arraySize; j++){
if (array[j] < array[i]){
indexRank++;
}
}
if (array[i] <= 0) {
ranks[i] = -1 // or whatever implementation you want here
} else {
ranks[i] = indexRank;
}
}
(注意ARRAYSIZE必须是值,而不是一个变量,因为C++不允许您静态具有可变大小定义一个数组)
感谢您的评论! –
我发现如果保持独立的值的值,原始位置,并且在一个类中的等级,这是更容易:
#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;
感谢您的评论! –
可以排序包含数字和阵列中的原来的位置的结构体的向量。排序后,您可以使用原始索引来创建想要的数组 – user463035818
'等级[5] = 2;'你有未定义的行为 –
他意味着等级[4] == 2应该是真的 – cokceken