C语言编程
*
选择法&双端选择法&数组排序
题目:编写c程序,输入十个整数,每轮挑出最小和最打大的两个数,分别置于数组两端,经过5轮完成数组的排序并输出。
考虑如何修改程序以提高效率。
编者给出的代码:
# include <stdio.h>//两端选择法数组排序
int main(void)
{
//int a[10]={0,9,8,7,6,5,4,3,2,1};//定义数组,非动态赋值!
int n,m,i,q,b,c,max,min;
int a[10];
for(i=0;i<10;i++)//动态赋值!
scanf("%d",&a[i]);
for(i=0,n=0;i<5;i++){
max=a[n];min=a[9-n];//动态改变max,min
b=n;c=9-n;
for(m=n;m<10-n;m++){//寻找当前轮次的最大值与最小值,记录其下标
if(max<a[m]){
max=a[m];
b=m;
}
if(min>a[m]) {
min=a[m];
c=m;
}
}
if(c==n) c=b;//防止下标改变而追踪不到
q=a[n];
a[n]=max;
a[b]=q;//交换最大值位与本轮首位的值
q=a[9-n];
a[9-n]=min;
a[c]=q;
n+=1;//交换最小值位与本轮末位的值
}
for(i=0;i<10;i++)//顺序输出数组a[10]
printf(" %d",a[i]);
return 0;
}
| 方法分析:
选择法:通过定义一个max或min来寻找整个数组中的最小值,即选着出数组中的最小值或最大值;
疑难解答:
十个整数,通过5轮选择;每一轮的开始要刷新本轮的max、min值以及本轮的最大值最小值下标;合理选着字符变量加以控制是关键;
出现特殊情况:
最小值下标为本轮首位的下标,则按照代码顺序,最小值已经被掉离,而记录的下标未及时改变导致出现错误!
特殊情况解决办法:
在选出max、min值以后添加if判断,若最小值下标为本轮首位,则追踪最小值下标!