原地重排列表
/*
功能:计算名次,时间复杂度为(n-1)n/2
参数列表:
a[]---表示需要计算名次的列表
n---表示需要计算名次列表的元素个数
r[]---记录名次的列表
*/
template<class T>
void rank(T a[], int n, int r[])
{
//初始化名次r[]
for (int i = 0; i < n; i++)
r[i] = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < i; j++)
if (a[j] <= a[i]) r[i]++;//与左边的数相比
else r[j]++;//与右边的数相比
}
/*
功能:交换两元素的数据
参数列表:
a---元素a
b---元素b
*/
template<class T>
void swap(T& a, T& b)
{
T temp;
temp = a;
a = b;
b = temp;
}
/*
功能:原地重排,交换次数为2(n-1),节省了内存空间
参数列表:
a[]---表示需要原地重排的列表
n---表示需要原地重排列表的元素个数
r[]---记录名次的列表
*/
template<class T>
void situ_rearrange(T a[], int n, int r[])
{
for (int i = 0; i < n; i++)
{
if (i != r[i])
{
swap(a[i], a[r[i]]);
swap(r[i], r[r[i]]);
}
}
}