改错题

下列给定程序中, 函数 fun()的功能是: 将 n 个无序整数从小到大排序。 请改正程序指定部位的错误, 使它能得到正确结果。
注意:
不要改动函数 main(), 不得增行或删行, 也不得更改程序的结构。
【试题源程序】
#include <stdio.h>
void fun(int n, int *a)
{
   int i,j,p,t;
   for(j=0;j<n-1;j++)
   {
      p=j;
      /**********found**********/
      for(i=j+1;i<n-1;i++)
         if(a[p]>a[i])
            /**********found**********/
            t=i;
      if(p!=j)
      {
         t=a[j];
         a[j]=a[p];
         a[p]=t;
      }
   }
}
void putarr(int n, int *z)
{
   int i;
   for(i=1;i<=n;i++,z++)
   {
      printf("%4d",*z);
      if(!(i%10))
         printf("\n");
   }
   printf("\n");
}
void main()
{
   int aa[20]={9,3,0,4,1,2,5,6,8,10,7},n=11;
   printf("\n\nBefore sorting %d numbers:\n",n);
   putarr(n,aa);
   fun(n,aa);
   printf("\nAfter sorting %d numbers:\n",n);
   putarr(n,aa);
}

【正确答案】

(1) 错误: for(i=j+1;i<n-1;i++)
正确: for(i=j+1;i<n;i++)
(2) 错误: t=i;
正确: p=i;

【答案解析】

错误 1: 选择排序法是在外循环中从第一个元素开始, 依次与比它小的元素进行交换, 直到交换完第 n-1 个元素, 最后一个元素就是最大的元素, 循环次数为 n-1 次, 如果设定循环次数为 n 次, 则最后一次第 n 个元素与自己交换; 内循环是找出比当前元素更小的元素, 故是从当前需要交换的元素的下一个元素开始, 直到第 n 个元素。 故“for(i=j+1;i<n-1;i++)” 应改为“for(i=j+1;i<n;i++)”。错误 2: t 是 fun 函数中用来交换两个元素的辅助变量, 不是交换元素下标的变量, 因此 t=i;是错误的。 p 是用来记录当前最小元素下标的, 当 a[p]>a[i]时, 把 i 赋给 p。 所以“t=i;” 应改为“p=i;”。