21. 名次计算算法

算法内容:

 一个元素在一个序列中的名次,是所有比它小的元素个数加上在它左边出现的与它相同的元素个数。

代码:

 1 template <typename T>
 2 void the_rank(const T* a, int n, T* r) {
 3     for (int i = 0; i < n; ++i) {
 4         r[i] = 0;
 5     }
 6     
 7     for (int i = 1; i < n; ++i) {
 8         for (int j = 0; j < i; ++j) {
 9             if (a[j] <= a[i]) {
10                 ++r[i];
11             } else {
12                 ++r[j];
13             }
14         }
15     }
16 }

代码解释:

先将 r 数组初始化,所有元素的名次均为 0。再进行比较,比较时以 i 元素为基准,将 i 前面的元素依次与 i 元素进行比较,若它们的值小于等于 i 元素,则 i 元素的名次增加 1,否则将另一个元素的名次增加 1。注意, i 元素是从 1 号下标开始(即数组的第二个元素), j 是从头开始,一直到 i 为止。

算法中有一个地方需要详细解释。一般思路可能是,i 元素从头开始,j 元素也从头开始,并且 i ,j 均到 n 结束。在这种情况下,对于每个 i ,我们都要进行 n - 1 次比较,这样就会产生错误:每一对元素比较了两次。实际上,固定当前元素,将它前面的元素依次与它比较,就能够避免上述错误。

猜你喜欢

转载自www.cnblogs.com/Hello-Nolan/p/12355309.html
21.