冒泡排序与回调函数——qsort

文章核心内容总结

本文围绕数组排序展开,先介绍了冒泡排序,后引入qsort库函数进行排序,并对二者进行了对比。

1. 冒泡排序实现

在探讨冒泡排序(Bubble Sort)这一经典的排序算法时,我们首先需要了解其基本思路和如何将其转化为代码实现。冒泡排序是一种简单直观的排序算法,它通过重复地遍历待排序的列表,依次比较相邻的两个元素,并根据比较结果交换它们的位置,使得较大的元素逐渐"沉"到列表的末尾,较小的元素"浮"到列表的前端,类似于气泡逐渐浮上水面的过程,因此得名"冒泡排序

冒泡排序的基本思路

冒泡排序的基本思路可以概括为以下几点:

  1. 比较相邻元素 :从列表的第一个元素开始,逐一比较相邻的两个元素。
  2. 交换位置 :如果前一个元素大于后一个元素,则交换它们的位置。
  3. 重复过程 :重复上述比较和交换的过程,直到整个列表被完全遍历。
  4. 减少比较次数 :每一轮遍历后,最大的元素会被放置在正确的位置,因此在下一轮遍历时,可以减少比较的次数。
  5. 优化:为了提高效率,可以在每一轮遍历后检查是否发生了交换,如果没有发生交换,则说明列表已经排序完成,可以提前终止排序过程

原理图解

那么我们想要解决十个数字的冒泡排序我们就要进行 10-1 次冒泡排序。

//升序排序

首先我们定义一个数组:

cpp 复制代码
int arr[]={9,8,7,6,5,4,3,2,1,0}

其次,我们写一个冒泡排序的函数将数组元素进行排序:

cpp 复制代码
#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

void Bubble_sort(int arr[], int sz)
{
	//趟数:sz-1
	int i = 0;
	for (i = 0;i < sz - 1;i++)
	{
		//一趟冒泡排序的过程
		int j = 0;
		//每完成两个数的比较,就少一次比较:sz-1-i
		for (j = 0;j < sz - 1-i;j++)
		{
			//如果第一个数比第二个数大那么两个数交换,否则不进行交换,接着进行下一个数的排序
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
	//写一个函数进行冒泡排序
	Bubble_sort(arr, sz);
    
	return 0;
}

最后,我们将数组进行输出即可:

cpp 复制代码
	//打印数组
	int i = 0;
	for (i = 0;i < sz;i++)
	{
		printf("%d ", arr[i]);
	}

完整代码

cpp 复制代码
#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

void Bubble_sort(int arr[], int sz)
{
	//趟数:sz-1
	int i = 0;
	for (i = 0;i < sz - 1;i++)
	{
		//一趟冒泡排序的过程
		int j = 0;
		//每完成两个数的比较,就少一次比较:sz-1-i
		for (j = 0;j < sz - 1-i;j++)
		{
			//如果第一个数比第二个数大那么两个数交换,否则不进行交换,接着进行下一个数的排序
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
	//写一个函数进行冒泡排序
	Bubble_sort(arr, sz);
    
	//打印数组
	int i = 0;
	for (i = 0;i < sz;i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

我们可以看见代码整体比较长,并且只能比较整型数据,那么这时候我们就可以使用回调函数,将代码变得简洁,并且可以比较其他类型的数据,这里我们使用的是库函数------qsort()

2. qsort函数介绍

qsort()函数的解析

在C语言中,qsort 是一个常用的排序函数,它属于标准库函数,用于对数组进行快速排序。qsort 的使用需要用户提供一个比较函数,这个比较函数决定了排序的规则

函数参数

    • base:要进行排序的数组。
    • num:数组元素的个数。
    • size:数组元素的字节大小。
    • compar:比较函数,用于决定排序规则。

使用 qsort****对整型数组升序排序示例

  • 使用 qsort****对整型数组升序排序示例
cpp 复制代码
#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>//qsort是一个库函数

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//对数组进行升序排序
	qsort(arr, sz, sizeof(arr[0]), cmp_int);

	//打印函数
	int i = 0;
	for (i = 0;i < sz;i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

对比之下,这样写不仅更加简洁,而且不再局限于整型数据的排序。

相关推荐
芯片SIPI设计5 分钟前
MIPI C-PHY 标准学习----一种通用多信号传输方案
c语言·开发语言·学习
纪元A梦24 分钟前
贪心算法应用:顶点覆盖问题详解
java·算法·贪心算法
爱补鱼的猫猫1 小时前
22、近端策略优化算法(PPO)论文笔记
论文阅读·算法
开心星人2 小时前
【论文阅读】Reconstructive Neuron Pruning for Backdoor Defense
论文阅读·算法·剪枝
XiaoCCCcCCccCcccC2 小时前
Linux网络基础 -- 局域网,广域网,网络协议,网络传输的基本流程,端口号,网络字节序
linux·c语言·网络·c++·网络协议
居然是阿宋2 小时前
C语言的中断 vs Java/Kotlin的异常:底层机制与高级抽象的对比
java·c语言·kotlin
_Itachi__3 小时前
LeetCode 热题 100 543. 二叉树的直径
java·算法·leetcode
是代码侠呀3 小时前
飞蛾扑火算法matlab实现
开发语言·算法·matlab·github·github star·github 加星
weixin_428498493 小时前
在Lua中使用轻量级userdata在C/C++之间传递数据和调用函数
c语言·c++·lua
C++ 老炮儿的技术栈4 小时前
C++中什么是函数指针?
c语言·c++·笔记·学习·算法