前言
按名次排序(Rank Sort)就是我们在已知一个数组序列及其次序的时候将其的次序和对应序列按照一定顺序排列一下,比如一个数组a为{4,3,9,3,7},其对应次序为{2,0,4,1,3},排列后要使其次序变成{0,1,2,3,4}.说到底,就是次序和数组的重新归位问题。
第一种思路:使用额外的数组空间
想象一个已知每个人高矮顺序的一列队伍,如果我们要想让其重新排好,我们可以再寻找一个空地,然后逐个询问,比如到无序队伍的第一个人,我们可以问:你的次序是多少,他说:我在最后一个,那好,那你站那片空地中的最后一个位置去。我们依次询问,便可以在那片空地中把队伍重新排好,最后让那列队伍再回来,我们便达到了排序的目的。这种方法虽然不需要比较,但是面对比较大的数组,可能空间的分配就不那么容易。代码实现“
void rankSortWithAdditionArray(int a[],int r[],int n)
{
int *u = new int [n];
for (int i = 0;i<n;i++)
{
u[r[i]] = a[i];
}
for(int i = 0;i<n;i++)
{
a[i] = u[i];
}
delete []u;
}
void swap(int &t1,int &t2)
{
int t = t1;
t1= t2;
t2 = t;
}
第二种思路:重点放在位置上,不使用额外的数组空间
结合上面的思路我们可以换一种想法,我们是排序,不设计数据元素的剔除或者是增加,你可以去新的地方找那个位置,为啥不能在现在的位置上和别人交换一下。每个人都找好自己的位置,那我们最终的目的也就完成了。
void rankSortWithoutAdditionArray(int a[],int r[],int n)
{
for(int i = 0;i<n;i++)
{
if (r[i]!=i)
{
int t = r[i];
swap(a[t],a[i]);
swap(r[t],r[i]);
}
}
}
以上就是我本人关于这个内容的一点思考,目前刚开始学习数据结构和算法的知识,可能有不对之处,欢迎大家批评指教!