按名次排序
给定一个数组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 }