bool IsUnique(int *ver,int const SIZE,int const iBegin=0)
//ver[SIZE]保存的是[ iBegin,iBegin+SIZE-1]区间的值
//注意:该算法会破坏原数组数据
//扩展:对于ver[SIZE]的数组,如果里面保存的数据是[iBegin,iBegin+SIZE-1]
//区间的值且不能重复,上面的程序稍微修改一下就能实现O(N)时间复杂度和O(1)
//空间复杂度的排序
{
int iCount=0;
for (int i=0;iCount<SIZE&&i<SIZE;++i)
{
if (ver[i]==i+iBegin)
{
continue;
}
while (ver[i]!=i+iBegin)
{
if (ver[i]==ver[ver[i]-iBegin])
{
return false;
}
swap(ver[i],ver[ver[i]-iBegin]);
++iCount;
}
++iCount;
}
return true;
}
bool IsUnique(unsigned int *ver,size_t const SIZE)
//ver[SIZE]保存的是[ 0,SIZE-1]区间的值
//注意:该算法不会破坏原数组元素,不过有个限制,就是必须满足:SIZE<2^31-1,
//当然对于long long类型的数组,是SIZE<2^63-1;当然要达到那样大的元素,
//几率不大
{
int iCount=0;
int i=0;
for (;i<SIZE;++i)
{
int iIndex=ver[i]&0X7FFFFFFF;
if ((ver[iIndex]&0X80000000))
{
break;
}
ver[iIndex]|=0X80000000;
}
for (int j=0;j<SIZE;++j)
{
ver[j]&=0X7FFFFFFF;
}
return i==SIZE;
}