c语言----冒泡排序(详解)

一、冒泡排序的思想

两两相邻的元素进行比较,并且有可能的话需要交换

二、冒泡排序的3种方法

2.1第一种以10个数为例

升序

	#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int m = 0;
	for (m = 0; m < 10; m++)
	{
		scanf("%d", &arr[m]);//输入10个数放进数组里面去

	}
	for (m = 1; m < =10; m++)//冒泡排序进行的趟数
	{
		int j = 0;
		for (j = 0; j < 10-m; j++)//一趟冒泡排序要进行多少对元素的比较
		{
			int temp = 0;
				if (arr[j] > arr[j + 1])
				{
					temp = arr[j + 1];
					arr[j + 1] = arr[j];
					arr[j] = temp;
				}
		}
	}
	for (m = 0; m < 10; m++)//打印冒泡排序排序好之后的数组
	{
		printf("%d ", arr[m]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

2.2 第二种在第一种的情况下进行优化升级

升序

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[10]);//表示数组的元素个数
	int m = 0;
	for (m = 0; m < sz; m++)
	{
		scanf("%d", &arr[m]);
	}
	for (m = 1; m <=sz; m++)//冒泡排序进行的趟数
	{
		int j = 0;
		int flag = 1;//假设待排序的数组中的元素已经有序
		for (j = 0; j < sz-m; j++)//对未排序元素进⾏冒泡排序
		{
				int temp = 0;
				if (arr[j] > arr[j + 1])
				{
					flag = 0;//只要交换说明正在排序的数据不是有序的
					temp = arr[j + 1];
					arr[j + 1] = arr[j];
					arr[j] = temp;
				}
		}
		if (flag == 1)//当前序列已经是升序状态,结束循环
		{
			break;
		}
	}
	for (m = 0; m < sz; m++)
	{
		printf("%d ", arr[m]);

	}
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

2.3第三种qsort 函数进行冒泡排序

qsort() 函数的声明:

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

参数:
base – 指向要排序的数组的第一个元素的指针。
nitems – 由 base 指向的数组中元素的个数。
size – 数组中每个元素的大小,以字节为单位。
compar – 用来比较两个元素的函数。
头文件:stdlib.h

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 0 };
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[10]);//表示数组的元素个数
	int m = 0;
	for (m = 0; m < sz; m++)
	{
		scanf("%d", &arr[m]);
	}
	qsort(arr,sz,4, cmp_int);
	for (m = 0; m < sz; m++)
	{
		printf("%d ", arr[m]);

	}
	return 0;
}

在这里插入图片描述

运行结果:
在这里插入图片描述
如果这个想让他降序排序可以将下面这行代码中的两个交换位置:
在这里插入图片描述

在这里插入图片描述
欧耶!!!!我学会啦!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值