使用 C++ 排列数组中所有元素
在给定的问题中,我们需要对数组的所有给定元素进行排序,最小的数字具有最小的秩,最大的具有最大的秩。我们还需要根据数字的频率更改数字的等级,例如 -
Input : 20 30 10Output : 2.0 3.0 1.0
Input : 10 12 15 12 10 25 12
Output : 1.5, 4.0, 6.0, 4.0, 1.5, 7.0, 4.0
Here the rank of 10 is 1.5 because there are two 10s present in the given array now if we assume they both take different ranks i.e. 1 and 2 and we thus divide it within themselves so their rank becomes 1.5 and 1.5.
Input : 1, 2, 5, 2, 1, 60, 3
Output : 1.5, 3.5, 6.0, 3.5, 1.5, 7.0, 5.0
寻找解决方案的方法
有两种不同的方法可以找到解决方案,它们是 -
蛮力方法
在这种方法中,我们将循环选择任何特定元素,并确定其排名。
示例
#include <bits/stdc++.h>输出结果using namespace std;
int main() {
int arr[] = {1, 2, 5, 2, 1, 25, 2}; // 给定数组
int n = sizeof(arr) / sizeof(arr[0]); // 我们给定数组的大小
float rank[n] = {0}; // 我们的排名数组
for (int i = 0; i < n; i++) {
int r = 1; // 大于 arr[i] 的元素数
int s = 1; // 等于 arr[i] 的元素数
for (int j = 0; j < n; j++) {
if (j != i && arr[j] < arr[i])
r += 1;
if (j != i && arr[j] == arr[i])
s += 1;
}
rank[i] = r + (float)(s - 1) / (float) 2; // 使用公式
//获得特定元素的等级
}
for (int i = 0; i < n; i++) // 输出行列
cout << rank[i] << ' ';
return 0;
}
1.5 4 6 4 1.5 7 4
该程序的时间复杂度为O(N*N),其中 N 是现在给定数组的大小;如您所见,我们的时间复杂度并不好,因此我们将提高其效率以更好地处理更高的约束。
有效的方法
在这种方法中,我们将采用一个新数组并立即对其进行排序,因为数组已排序,现在我们知道相同等级的所有元素将在一起,所以现在我们像往常一样对它们进行排序,然后计算一个特定元素。
示例
#include <bits/stdc++.h>输出结果using namespace std;
int main() {
int arr[] = {1, 2, 5, 2, 1, 60, 3}; // 给定数组
int n = sizeof(arr) / sizeof(arr[0]); // 我们给定数组的大小
float rank[n] = {0}; // 我们的排名数组
int old[n];
for(int i = 0; i < n; i++)
old[i] = arr[i];
sort(arr, arr+n); // 对数组进行排序
int prev = arr[0];
int r = 1; // 等级
int s = 0; // 频率
int tot = 0; // 将叠加一个元素包含的所有等级
map<int, float> rrank;
for (int i = 0; i < n; i++) {
if(prev == arr[i]) {
s++;
tot += r;
} else {
float now = 0;
now = (float)tot/s; // 平分队伍
rrank[prev] = now;
prev = arr[i];
tot = r;
s = 1;
}
r++;
}
rrank[arr[n-1]] = (float)tot/s;
for (int i = 0; i < n; i++) // 输出行列
cout << rrank[old[i]] << " ";
return 0;
}
1.5 3.5 6 3.5 1.5 7 5
上面代码的解释
在这种方法中,我们对数组进行排序,然后对每个元素进行排序(从 1 开始排序)。现在,如果我们的 prev 元素等于我们的当前元素,我们增加 s 并叠加到我们的排名总和。当我们的元素发生变化时,我们在之前的元素之间划分等级,刷新 s 和 total,然后继续我们的代码。
结论
在这篇文章中,我们解决了一个问题,找出数组中所有元素的 Rank。我们还学习了针对这个问题的 C++ 程序以及我们解决这个问题的完整方法(普通和高效)。我们可以用其他语言编写相同的程序,例如 C、java、python 和其他语言。
以上是 使用 C++ 排列数组中所有元素 的全部内容, 来源链接: utcz.com/z/338681.html