#include
int main()
{
void sort(int array[],int n);//声明函数
int a[10],i;
printf("enter array:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);//调用函数
printf("The sorted array:\n");
for(i=0;i<10;i++)
printf(" %d",a[i]);
printf("\n");
return 0;
}//主函数部分
void sort(int array[],int n)//定义函数
{
int i,j,t,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k])
k=j;
t=array[k];
array[k]=array[i];
array[i]=t;
}
}
函数的前半部分都能看懂,从if(array[j]<array[k])这不太明白,为什么要引进变量k呢,循环之后array[k]的值怎么判断呢。我是这么想的,比如三个数:3,2,2.5。第一次array[k]=array[0]=3,array[j]=array[1]=2,条件成立,所以k=1,t=2,array[k]=array[i]=array[0]=3,array[0]=2。此时变为2,3,2.5我是能理解的。但是第二次内循环,此时j=2,array[2]=2.5,array[k]=array[i]=3,也成立。那继续程序,k=j=2,t=2.5,array[k]=2,array[i]=2.5,变为了2.5,3,2不就出错了吗,对这里的逻辑不太理解,还请各位帮帮小白,谢谢大家!
k用来存储每趟遍历最小元素的下标,以便后来交换。
先纠正一下,你举的例子中2.5是float类型的,并不是int型的。
那就按你这个来说,第一次循环后,arry[0]=2,arry[1]=3,arry[2]=2.5
第二次循环开始后:
i=1, k=i=1, 所以arry[i]=arry[k]=arry[1]=3;
j=i+1=2; 所以arry[2]=2.5;
因为arry[j]=2.5,arry[k]=3,所以arry[j]<arry[k]
因为k=j=2,所以arry[k]=arry[j]=2.5
下面三句话是对arry[k]和arry[i]进行交换
t=array[k];
array[k]=array[i];
array[i]=t;
就相当于
t=array[2]=2.5;
array[2]=array[1]=1;
array[1]=t=2.5;
所以数据的各值为arry[0]=2,arry[1]=2.5,arry[2]=3
你对照下,看是不是这个,然后你以后遇到错误这样分析,初学者对这些逻辑就是特别迷糊,我刚开始也是这样