算法内容:
一个元素在一个序列中的名次,是所有比它小的元素个数加上在它左边出现的与它相同的元素个数。
代码:
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 次比较,这样就会产生错误:每一对元素比较了两次。实际上,固定当前元素,将它前面的元素依次与它比较,就能够避免上述错误。