使用 C++ 查找数组中所有元素的排名
在给定的问题中,我们需要对数组中所有给定的元素进行排名,其中最小的数字具有最小的排名,最大的数字具有最大的排名。我们还需要根据数字的频率更改其排名,例如 -
Input : 20 30 10 Output : 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}; // given array int n = sizeof(arr) / sizeof(arr[0]); // size of our given array float rank[n] = {0}; // our ranking array for (int i = 0; i < n; i++) { int r = 1; // the number of elements greater than arr[i] int s = 1; // the number of elements equal to 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; // using formula //to obtain rank of particular element } for (int i = 0; i < n; i++) // outputting the ranks 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}; // given array int n = sizeof(arr) / sizeof(arr[0]); // size of our given array float rank[n] = {0}; // our ranking array int old[n]; for(int i = 0; i < n; i++) old[i] = arr[i]; sort(arr, arr+n); // sorting the array int prev = arr[0]; int r = 1; // ranks int s = 0; // frequency int tot = 0; // will stack up all the rank contained by an element 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; // dividing the ranks equally 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++) // outputting the ranks cout << rrank[old[i]] << " "; return 0; }
输出
1.5 3.5 6 3.5 1.5 7 5
上述代码的解释
在这种方法中,我们对数组进行排序,然后从开头对每个元素进行排名(排名从 1 开始)。现在,如果我们的前一个元素等于我们的当前元素,我们将增加 s 并累加到我们的排名总和中。当我们的元素发生变化时,我们将排名分配给先前的元素,刷新 s 和总计,并继续我们的代码。
结论
在本文中,我们解决了一个问题,即查找数组中所有元素的排名。我们还学习了此问题的 C++ 程序以及我们解决此问题的完整方法(普通和高效)。我们可以在其他语言(如 C、Java、Python 和其他语言)中编写相同的程序。
广告