下列程序横线处,应该输入的是( )。
#include<iostream>
using namespace std;
int n,a[10001];
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=n;i>1;i--)
for(int j=1;j<i;j++)
if(a[j]>a[j+1])
;
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}答案A。代码补全要考虑参数传递方式。如果需要修改实参,需用指针(*)传递。排序算法要理解每步比较的含义。
排序代码补全要理解每步比较的含义。选择排序找最小值时比较的是array[min]>array[j]。
【考点】算法:冒泡排序|指针与引用|GESP四级
【解题思维】 外层循环i从n递减到2,控制排序轮数;内层循环j从1到i-1,每次比较相邻两元素a[j]与a[j+1],若逆序则交换。命题人挖掉交换语句,就是要你识别冒泡排序的核心操作——交换当前比较对。
【陷阱拆解】
swap(a[j],a[j+1]):正确,元素下标与if判断条件完全对应。swap(a[j-1],a[j]):下标整体左移,交换的是前一对,逻辑错。swap(a[j-1],a[j+1]):跨位交换,破坏相邻比较原则,错。swap(&a[j-1],&a[j+1]):传递的是地址(整型指针),而swap形参是引用 int &,类型不匹配会编译错误,这是最阴险的坑——很多人只背"要传地址"却忽略函数签名。【反命题思维】 把swap(a[j],a[j+1])改成swap(a[j],a[j]),数组将保持原样,因为自引用交换无意义;若把if条件改成a[j]==a[j+1],则永远不交换,输出不变。刷到这种挖空题,先问自己:挖掉的是哪一对?哪一对才和判断条件对应?