第 23 题
#include<cstdio>
using namespace std;
int k,n,ans;
int a[50010],r[50010];
void merge_sort(int s,int t) {
if(s==t)
return;
int m=(s+t)>>1;
merge_sort(s,m);
merge_sort(m+1,t);
int i=s,j=m+1,k=s;
while(i<=m&&j<=t) {
if(a[i]<=a[j])
r[k++]=a[i++];
else {
r[k++]=a[j++];
ans+=m-i+1;
}
}
while(i<=m)
r[k++]=a[i++];
while(j<=t)
r[k++]=a[j++];
for (int p=s; p<=t; ++p)
a[p]=r[p];
}
int main() {
scanf ("%d", &n) ;
for(int i=1; i<=n; ++i)
scanf ("%d",&a[i]);
merge_sort(1, n) ;
printf ("%d\n",ans);
for(int i=1; i<=n; i++)
printf("%d ",a[i]);
return 0;
}
假设输入的n是不超过5000的正整数,试完成下面的判断题和选择题。
判断题
第 23 题 若将第31行的merge_sort(1,n)改成merge_sort(0,n),输出结果不变。()
第 24 题 若将第31行的merge_sort(1,n)改成merge_sort(1,n+1) ,输出结果不变。()
第 25 题 输出结果中ans的值一定大于0。( )
第 26 题 该程序最坏情况下的时间复杂度是O(nlogn),平均时间复杂度是0(nlogn) ()
第 27 题 若输入的n值是5,数组●的值是4,5,3,2,1,则输出结果是( )。
第 28 题 (4分)若输入的n值是5,数组a的值是4,5,3,2,1,但将第31行改成merge_sort(3,n),则输出结果是()。