日志
乎乎所在的班级要开运动会了,班主任是教信息学的y老师,他要将n个同学们按照身高从矮到高排成一排。初始同学们杂乱无章的站成一排,y老师采用的身高排序方法是:从第一个排头同学到最后一个排尾同学,依次比较相邻两个同学的身高,如果两位同学身高排序错位(即:高个同学在矮个同学前面),就移动两个同学位置,算作高个同学和矮个同学各移动一次。通过一轮两两比较和移动,最高的同学可以到排尾。重复上述过程,依次给一排的倒数第2个,倒数第3个,......,倒数第n-1个(正数第2个),倒数第n个(正数第1个) 找到按从矮到高对应身高的同学。乎乎想知道y老师的排序方法是否好,请编程帮他实现计算所有同学的平均移动次数。
比如:3名同学,初始按照身高156 144 138站成一排。
第一轮排序:身高156的同学移动2次,身高144的同学移动1次,身高138的同学移动1次,排序后:144 138 156,第一轮移动4次。
第二轮排序:身高156的同学移动0次,身高144的同学移动1次,身高138的同学移动1次,排序后:138 144 156,第一轮移动2次。
上述两轮排序后,共移动6次,平均移动次数为:6 / 3 = 2 (次)
#include<iostream>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int h[n];
for(int i=0;i<n;i++)
{
scanf("%d",&h[i]);
}
int temp;
int sum=0;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(h[j]>h[j+1])
{
temp=h[j+1];
h[j+1]=h[j];
h[j]=temp;
sum=sum+2;
}
}
}
double a=(double)sum/n;
printf("%.1lf",a);
}
#include <iostream>
:从 C++ 标准库中引入<iostream>
头文件,用于提供输入输出功能。
using namespace std;
:由于 C++ 标准库中的函数和对象都是在命名空间std
中定义的,通过这句指令可以在程序中直接使用std
命名空间中的成员,而无需加上命名空间的限定。main
函数中:定义一个整数n,通过scanf函数从用户处获取其值,用于表示数组的大小。定义一个整数数组h,其大小为n。通过两个嵌套的循环对数组h进行冒泡排序。在内层循环中,如果相邻的两个元素顺序不对(前一个大于后一个),就将它们交换位置,并将sum增加 2。计算交换操作的总次数sum与数组大小n的比值a,并将其以保留一位小数的形式输出。