按名次排序

给定一个数组a[], 得出一个数组中对应元素的名次,保存在另外一个数组里

名次定义为:从小到大排序,相等的元素先出现的排在前边

  void ranking(T a[], int n, int r[])函数得出名次数组r[ ]

void rearrange(T a[], int n, int r[])函数按照名次信息对原数组进行排序

注意:数组作为参数传递时,有两种途径,一种是 int a[ ],另一种是 int *a,无论哪种途径,都不是复制后传值,

而是直接传递地址值,所以在函数内改变数组内容会直接改变原数组的内容

 1 //类型模板.h
 2 
 3 #ifndef LEIXINGMUBAN
 4 #define LEIXINGMUBAN
 5 #pragma once
 6 template<class T>
 7 void ranking(T a[], int n, int r[])
 8 {
 9     for (int i = 0; i < n; i++)
10     {
11         r[i] = 0;
12     }
13     for (int i = 0; i < n; i++)
14     {
15         for (int j = i + 1; j < n; j++)
16         {
17             if (a[i] > a[j])
18                 r[i]++;
19             else
20                 r[j]++;
21         }
22     }
23 }
24 
25 template<class T>
26 void rearrange(T a[], int n, int r[])
27 {
28     T* u = new T[n];
29     for (int i = 0; i < n; i++)
30     {
31         u[r[i]] = a[i];
32     }
33 
34     for (int i = 0; i < n; i++)
35     {
36         a[i] = u[i];
37     }
38     delete[]u;
39 }
40 
41 #endif // !LEIXINGMUBAN
 1 //main
 2 
 3 /*
 4 先将一个数组的名词计算出来保存到一个同等大小
 5 的数组里,然后利用名次对原数组重新排序
 6 */
 7 #include<iostream>
 8 #include"类型模板.h"
 9 using namespace std;
10 
11 
12 int main()
13 {
14     double a[5] = { 1.9,3.2,3.1,4.25,2 };
15     int r[5];
16     ranking(a, 5, r);
17     for (int k = 0; k < 5; k++)
18     {
19         cout << a[k] << endl;
20     }
21     cout << "----------------" << endl;
22     rearrange(a, 5, r);
23     for (int k = 0; k < 5; k++)
24     {
25         cout << a[k] << endl;
26     }
27 }

原文地址:https://www.cnblogs.com/hustsss/p/11176808.html