一个元素在序列当中的名次,例如{4,3,9,3,7},最左边出现的3 名次记成0,后面出现的3记1,从小到大从左到右可以将名次记为{2,0,4,1,3}。现在需要对于一组序列进行名次计算,并根据名次对于原序列重新进行排列。
#include<iostream>
using namespace std;
template<class T>
void rank1(T a[],int b[],int n)
{
T *c=new T[n]; //新创建数组,用动态内存,也可以直接c[10]
int i,j;
for(i=0;i<n;i++)
b[i]=0; //初始化
for(i=1;i<n;i++)
for(j=0;j<i;j++)
if(a[j]<=a[i])b[i]++;
else b[j]++;
for(i=0;i<n;i++)
c[b[i]]=a[i]; //将原序列的值移动到正确的位置
for(i=0;i<n;i++)
a[i]=c[i]; //重新排列
delete []c;
}
int main()
{
int a[]={4,3,9,3,7};
int b[10];
int c[10];
rank1(a,b,5);
cout<<"对应名次为:";
for(int i=0;i<5;i++)
cout<<b[i];
cout<<"新序列为:";
for(int j=0;j<5;j++)
cout<<a[j];
system("pause");
return 0;
}