7-3 选择法排序 (20 分)

for(k=0;k<n-1;k++){
    index=k;
    for(i=k+1;i<n;i++){
        if(a[i]>a[index])
        {
            index=i;
        }
    }
    temp=a[index];
    a[index]=a[k];
    a[k]=temp;
}

可以讲一讲第二个循环中i=k+1;i<n;i++是什么意思?

内循环去选取当前元素的后面元素来跟当前元素进行判断。
首先以第1个位置的数字,依次与2、3、4……n个位置的数字作比较。
如果第1个位置的数字大于或等于某一个位置的数字,则两个位置的数字不变,反之则将两个位置的数字进行互换。
当第一轮比较大小完成后,此时第1个位置的数字即为此排序数列的最大值。
接下来选择第2个位置的数字,以同样的方法依次与3、4、5……n个位置的数字作比较,将最大值放在第2个位置。
依循此方法直到第n-1位置的数字和第n位置的数字比较大小之后,整个数列就由大到小来排列。
简而言之,其主要思想是在要排序的一组数列中,选出最大的一个数与第1个位置的数交换;
然后在剩下的数当中再找最大的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
数列如需要由小到大排序,原理相同。

选择排序的过程是:
找到最小的值,交换该值与位置0处的值,也就是把最小的值放入位置0,然后在剩余的元素中,找到最小的放入位置1,依次类推。
所以,每次第二个循环都是从k+1开始的,当然,从k开始也是可以的,但是a[k]和a[k]相同,同一个值交换没有意义,所以一般都是从k+1开始比较,找到最小的值后,在跟a[k]交换。

第一个循环是从数组中第一个元素开始作为比较对象
第二个循环是从数组中当前比较对象之后的每个元素,与当前比较对象进行大小比较,如果需要交换,则进行数值交换
第一层循环只需要处理到倒数第二个元素,因为最后一个元素不用比了,它后面没有元素啦