【例6-23】批量数据处理综合应用(1)

//采用冒泡法对选秀节目中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;
}

【例6-23】批量数据处理综合应用(1)

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;
}

 【例6-23】批量数据处理综合应用(1)

上一篇:Golang并发编程入门教程


下一篇:c++入门3:数据结构