C语言 冒泡排序

目标:

使用冒泡排序对一个数组进行排序

要求:

(1)从小到大输出排序结果 

(2)输出每一趟排序

(3)计算交换多少次

一 、将数组元素输入

本题要求先输入数组元素个数后再输入对应个数的元素后存入数组中再进行排序,主函数如图:

#include<stdio.h>
int main()
{
	//int arr[] = { 9,8,7,6,5,4,3,2,1 };

	int i = 0;
		int n = 0;
	int arr[9] = {0};
	scanf_s("%d", &n);//输入数组元素个数
	for (i = 0; i < n; i++)//将数组元素存入数组中
	{
		scanf_s("%d", &arr[i]);
	}
	int sz = sizeof(arr) / sizeof(arr[0]);//求出数组的长度
	bubble(arr, sz);//冒泡排序的函数
	return 0;
}

二、进行冒泡排序

在输入数组元素后建立一个函数对数组进行排序并将数组输出,

以下为简单的冒泡排序代码:

void bubble(int arr[], int sz)
{
	int i, j, temp;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		for (j = 0; j < sz; j++)
		{
			printf("%d ", arr[j]);
		}
	}
}

注意:

冒泡排序的原理是将第一个元素与后面的元素进行比大小 若改元素满足题目要求则二者进行替换,以此类推,将元素从左至右进行依次排序,如若需要对冒泡排序的次数、元素交换次数及每次冒泡排序后的结果进行打印出来便于更直观的看则可对上述代码进行优化,得到以下代码:

void bubble(int arr[], int sz)
{
	int i, j, temp;
	int count = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				count++;
			}
		}
		printf("第%d轮冒泡排序:", i + 1);//打印每轮的冒泡排序 
		for (j = 0; j < sz; j++)
		{
			printf("%d ", arr[j]);
		}
		printf("\n\n");
	}
	printf("最终结果是: ");//打印最终结果 
	for (i = 0; i <= sz - 1; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	printf("共交换%d次", count);//打印次数
}

由于在main函数中已经输入过n,则n即为数组的长度,后续无需再进行

int sz = sizeof(arr[])/sizeof(arr[0]);的计算  所以上述代码中该语句可删除

完整代码如下:

#include<stdio.h>
void bubble(int arr[], int sz)
{
	int i, j, temp;
	int count = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				count++;
			}
		}
		printf("第%d轮冒泡排序:", i + 1);//打印每轮的冒泡排序 
		for (j = 0; j < sz; j++)
		{
			printf("%d ", arr[j]);
		}
		printf("\n\n");
	}
	printf("最终结果是: ");//打印最终结果 
	for (i = 0; i <= sz - 1; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	printf("共交换%d次", count);//打印次数
}
int main()
{
	//int arr[] = { 9,8,7,6,5,4,3,2,1 };

	int i = 0;
		int n = 0;
	int arr[9] = {0};
	scanf_s("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf_s("%d", &arr[i]);
	}
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, sz);
	return 0;
}

运行结果如图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值