至此,排序完成。(5)显然,上述9个单重循环可以合并为如下的双重循环。for(i=0;i<=8;i++)//找9轮最大数//选择本轮最大数(for(1=i+1ii<=9:i++)if(a[i]<a[j])(t=a[i];a[i]=a[j];a[j]=t;1F完整的源程序:#include<stdio.h>intmain(void){int a[lo],i,j,t;版社printf("请输人10个整数(用空格分隔):n");for(i=0;i<lo:i++)scanf("%d",&a[i]);/找9轮最大数for(i=0:i<=8;i++)(for(j=i+1;j<=9;j++)//选择本轮最大数if (a[i]<a[jl)(t=a[i];a[i]=a[jl;a[j]=t;]printf("排序后的结果为:In");for(i=0;i<10;i++)printf("d",a[ij);1/数据之间用空格分隔printf("\n");return 0;【例6.6】从键盘输人10个数,用改进的选择法按降序排序并输出。编程思路:(1)在原始的选择法中,为了找出10个数中的最大数,依次将a[0]与其余9个数组元素ai]比较,只要a[i]大于a[0],就将a[j]的值与a[0]的值相交换。其实最终目的是找出10个数中的最大数,并将该最大数置人数组元素a[0]中。因此,完全可以先找出10个数中的最大数,再将该元素的值与a[01的值交换,从而减少交换的次数可用如下程序段实现:i=0;ck=i;/ /k保存10个数中最大数的下标语for(j=i+I:j<=9:j++)言程(if(a[j]>a[k])k=j;库1设t=a[i];a【i]=a[k];a[k]=t;/ /将10个数中的最大数与a[0】的值互换计(2)同样地,要找出剩余9个数中的最大数,并置人数组元素a[1]中,可用如下程序新思段实现。路1=1;84
k=i;/ /k保存9个数中最大数的下标for(j=i+1;j<=9;j++)(if(a[j]>a[k])k=j;1t=a[i];a[i]=a[k];a[k]=t;/ /将9个数中的最大数与a[1]的值互换(3)以此类推,直至找出剩余2个数中的最大数,并置人数组元素a[8]中,可用如下程序段实现。i=8;k=i;//k保存2个数中最大数的下标for(j=i+l;j<=9;j++)(if(a[j]>a[k])k=ji//将2个数中的最大数与a【8]的值互换t=a[il;a[i]=a[k]ia[k]=t;至此完成排序,总共需要9个单重循环。(4)而上述9个单重循环可以合并为如下的一个双重循环。for(i=-0;i<-8;i++)//k保存本轮最大数的下标(k=i;for(j=i+1;j<=9;j++)(if(a[j]>a[k])k=j;//将本轮最大数a[k]与a[i]互换t=a[ilia[i]=alk]ia[k]=t;完整的源程序:#include<stdio.h>int main(void)(inta[io],t,i,i,k;printf("请输人10个整数(用空格分隔):In");for(i=0;i<-9;i++)scanf("gd",&a[il);//找9轮最大数for(i=0;i<=8;i++)//k保存本轮最大数的下标(k=i;forj=i+l;j<=9;j++)(if(a[j]>a[k])k=j;1第//将本轮最大数a[k]与a[i]互换t=a[ilia[i]=a[k]a[k]=t,6章printf("排序后的结果为:In")for(i=0;i<=9;i++)1/数据之间用逗号分隔printf("%d,",a[ij);数printf("In");return 0;组85