书上的例子:
#include <stdio.h>
int main()
{
void sort (int x[],int n);
int i,*p,a[10];
p=a;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;
sort(p,10);
for(p=a,i=0;i<10;i++)
{
printf("%d ",*p);
p++;
}
printf("\n");
return 0;
}
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
问题:
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
运行结果没问题,但它不是明显有问题吗?当i=0时,是把最小的一个数调到数组的最后一个元素,而当i=1时,第一个元素已不再做比较,可是第一个元素不一定是最大的,这样怎能按由大到小的顺序排列呢?我把它改成:
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
{
t=x[j];
x[j]=x[k];
x[k]=t;
}
}
}
我脑子都快爆开了,希望高手能够说明书中给出的例子为什么对
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
不是又把X[k]变小了吗
刚开始执行时i=0,k=0,经过
for(j=i+1;jx[k])
k=j;
选择出了这所有数中的最大数假设是x[4],即此时j=4,k=4,再经过
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
使x[0]的值和x[4]的值互换,最大数就放到了最前面位置,再返回到第一重循环,i=1,k=1,再执行下面的语句,如此下去...
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
不是又把X[k]变小了吗,也就是x[i]>x[k],第二次比较的时候就x[k]与第三个元素比较,这样令最大值排第一位呢