一个元素在一个序列中的名次是所有比它小的元素个数加上在它左边出现的与它相同的元素个数
例如:数组a=[4,2,9,2,6]是一个序列,各元素的名次为ra=[2,0,4,1,3]。
//名次计算template<class T>void rank(T a[], int n, int ra[]){//给数组a的n个元素排名次结果在ra中返回for (int 1 = 0; i < n; i++){ra[i] = 0;//初始化}//比较所有元素for (int i = 1; i < n; i++){for (int j = 0; j < i; j++){if (a[j] <= a[i])ra[i]++;elsera[j]++;}}}
利用名次计算后的结果ra[n],将成绩按照名次进行排序,函数如下:
//按照名次排序template <class T>void reOrder(T a[], int n, int ra[]){T *u = new T[n];//定义数组u,将元素排序//把a中的元素添加在u中for (int i = 0; i < n; i++){u[ra[i]] = u[i];}//吧u中的数据复制给afor (int i = 0; i < n; i++){a[i] = u[i];}}
在这回顾一下选择排序和冒泡排序的方法,程序分别如下:
//选择排序template <class T>viod selectSort(T a[], int n){for (int k = 0; k < n; k++){int recordMaxIndex = 0;for (int i = 0; i < n-k; i++){if (a[i]>a[recordMaxIndex])recordMaxIndex = i;}swap(a[n-k-1], a[recordMaxIndex]);}}//冒泡排序template<class T>void bubbleSrot(T a[], int n){for (int i = n; i > 1; i--){for (int k = 0; k < i - 1; k++){if (a[k]>a[k + 1])swap(a[k], a[k + 1]);}}}