有1,2,一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.该怎么解决

有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.
复习的老题了     还是没整明白

#include   "stdio.h "

main()
{
int   *a,n,i,j,temp;
printf( "input   the   numbers\n   ");
scanf( "%d ",&n);

a=(int   *)malloc(n*sizeof(int));                 /*   用malloc动态分配数组*/
for(i=0;i <n;i++)
        a[i]=i;


for(i=0;i <n;i++)
{       temp=a[i];
        j=rand()%n;                                                 /*rand()打乱顺序*/
        a[i]=a[j];
        a[j]=temp;
}

for(i=0;i <n;i++)
printf( "%d   ",a[i]);
printf( "\n ");

for(i=0;i <n;i++)
{
                                                                          /*就是这里遇到麻烦鸟*/
temp=a[a[i]-1];                                             /*感觉思路就是这样的,可是不行哇*/
a[a[i]-1]=a[i];                                             /*有时是排0的时候出问题*/
a[i]=   temp;                                                     /*有时结果根本就是乱排的*/
}

for(i=0;i <n;i++)
printf( "%d   ",a[i]);
printf( "\n ");


getch();
}



------解决方案--------------------
这么修改吧:

for(temp=0; temp <n; )
{
if(a[a[temp]] != a[temp])
a[temp]=a[a[temp]]+a[temp]-(a[a[temp]]=a[temp]); //这里是交换 a[a[temp]]和a[temp]
else temp++;
}