排序前言&冒泡排序

目录

排序应用

常见的排序算法

BubbleSort冒泡排序

整体思路

图解分析 ​

代码实现

每趟

写法1

写法2

代码NO1

代码NO2优化

时间复杂度


排序概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

  • 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。
  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

排序应用

排序的应用场景很多: 学校医院品牌的排名等等。

算法当中也常用,二分查找,去重算法等等。

常见的排序算法

  • 冒泡排序
  • 直接插入排序&VS冒泡排序
  • 希尔排序(在插入排序的基础上)
  • 选择排序VS堆排序
  • 快速排序
  • 归并排序
  • 补充:外排序
  • 排序的OJ题目
  • 排序的思想:先单趟再多趟,注意结束条件❗先局部再整体

BubbleSort冒泡排序

整体思路

  • 通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒泡。
  • 一趟:两两比较(若顺序则不交换,若逆序则交换)
  • 整体:重复上述过程,直到全部数组元素都每趟完成。
  • 优化:若某一趟发现,数组元素已经顺序不用继续冒泡下去,停止冒泡。(效率提高)

图解分析

代码实现

每趟

  • n个数的下标是0~n-1
  • i每次从0开始,则比较的是下标为i和i+1的数值
  • i每次从1开始,则比较的是下标为i-1和i的数值
  • 注意:i每次从第一个数值开始冒泡,不是第j格数值开始冒泡
写法1
cs 复制代码
	//写法1
	for (int i = 0; i < n-1; i++)
	{
		if (a[i] > a[i + 1])//i=n-1就越界了
		{
			Swap(&a[i], &a[i + 1]);
		}
	}
写法2
cs 复制代码
	//写法2
	for (int i = 1; i < n; i++)
	{
		if (a[i - 1] > a[i])//i=n-1没有越界,
		{
			Swap(&a[i - 1], &a[i]);
		}
	}

代码NO1

cs 复制代码
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; j++)
	{
		//一趟
		for (int i = 0; i < n - 1 - j; i++)//i要从第一个开始交换
		{
			if (a[i] > a[i + 1])//i=n-1就越界了
			{
				Swap(&a[i], &a[i + 1]);
			}
		}
    }

代码NO2优化

cs 复制代码
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; j++)
	{
		//一趟
		bool exchange = false;
		for (int i = 0; i < n - 1 - j; i++)//i要从第一个开始交换
		{
			if (a[i] > a[i + 1])//i=n-1就越界了
			{
				Swap(&a[i], &a[i + 1]);
				exchange = true;
			}
		}
		if (exchange == false)
		{
			break;
		}
    }
}

时间复杂度

时间复杂度:经典的O(N^2)

🙂感谢大家的阅读,若有错误和不足,欢迎指正!

相关推荐
田野追逐星光几秒前
C++继承 -- 讲解超详细(上)
c++·算法
ZPC82109 分钟前
ROS2 共享内存 SHM > UDP 速度
人工智能·算法·计算机视觉·机器人
AI人工智能+电脑小能手12 分钟前
【大白话说Java面试题】【Java基础篇】第4题:LinkedList是单向链表还是双向链表
java·开发语言·数据结构·后端·链表·面试·list
三毛的二哥9 小时前
BEV:典型BEV算法总结
人工智能·算法·计算机视觉·3d
南宫萧幕9 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
charlie11451419110 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler0111 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你9111 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
我叫黑大帅11 小时前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头11 小时前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法