//采用冒泡法对选秀节目中10位评委所给出的分数排序。
冒泡法:从首元素开始两两比较,score[j] 和 score[j + 1],若score[j] > score[j + 1],
则score[j] 与 score[j + 1]进行交换,完成交换需要一个中间参数n,
n = score[j]; //把原score[j]的值赋给中间参数n
score[j] = score[j + 1]; //把score[j+1]的值赋给score[j]
score[j + 1] = n; //把中间参数n中的原score[j]赋给score[j+1]
过程:经过第一轮的两两比较,score[10]数组中的最大值就被交换到了最后一个元素score[9]中;
因为第一轮的比较已经排出最大数,所以第二轮两两比较只需比较除score[9]的元素,即[0]~[8];
第三轮则两两比较[0]~[7],以此类推。N个元素需要N-1轮排序。
#include<stdio.h>
int main()
{
int i = 0;
double score[10];
printf("请输入10位评委的分数:");
while (i < 10)
{
scanf_s("%lf", &score[i]);
i++;
}
int j = 0, k = 0;
double n = 0; //定义一个n作为中间参数
for (i = 0; i < 9; i++) //第一层循环,控制轮数
{
for (j=0;j<9-i;j++) //第二层循环,控制元素两两比较次数
{
if (score[j] > score[j + 1])
{
n = score[j]; //把原score[j]的值赋给中间参数n
score[j] = score[j + 1]; //把score[j+1]的值赋给score[j]
score[j + 1] = n; //把中间参数n中的原score[j]赋给score[j+1]
}
}
}
for (k = 0; k < 10; k++) //输出排序好的数组元素
{
printf("%7.2lf", score[k]);
}
return 0;
}
ps:上面的程序是抄了题目没看书前自己写的,因为题目只说了给分数排序,所以自己写的没有
每轮排序情况的输出显示。而且在for循环嵌套的第二层循环,控制元素两两比较次数上,循环控制条件写成了j<9,当时的想法是,大循环第一轮比较,小循环需要比较9次,然后想当然的认为大循环第二轮比较,小循环也需要比较9次,虽然也能实现,但上一轮排好的最大数在每轮循环又排了一次,那算法的时间复杂度就增加了。记录该思路错误。把书本的程序也敲下来,如下:
#include<stdio.h>
#define N 10
int main()
{
int i, j, k;
double t, a[N];
printf("请输入%d个评委所给出的分数:\n", N);
for (i = 0; i < N; i++) //输入待排序的N个数
scanf_s("%lf", &a[i]);
for (i = 0; i < N - 1; i++) //N个数需要N-1轮排序
{
for (j = 0; j < N - 1 - i; j++) //每轮排序的两两比较
{
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
printf("\n第%d轮排序后的情况为:\n", i + 1);
for (k = 0; k < N; k++) //输出每轮排序后的情况
{
printf("%7.2lf,", a[k]);
}
}
printf("\n数组冒泡最终结果为:\n");
for (i = 0; i < N; i++)
printf("%7.2lf", a[i]);
return 0;
}