有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++;
}
复习的老题了 还是没整明白
#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++;
}