【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】

目录

前言

1.冒泡排序

1.1冒泡排序动图

1.2冒泡排序源代码

1.3冒泡排序的特性总结

2.快速排序👑

2.1hoare版本实现思想

排序前

排序中

排序后

2.2hoare版本快排源代码

2.3分析先走

情况1🥇

情况2🥈


前言

交换类排序两个常见的排序算法【冒泡排序】、【快速排序】


交换排序基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。


交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。


1.冒泡排序

1.1冒泡排序动图

冒泡排序动图

1.2冒泡排序源代码

复制代码
void BubbleSort(int* a, int n)
{
	assert(a);

	for (int j = 0; j < n - 1; ++j)
	{
		int exchange = 0;//这里的exchange的值作为是否交换的标志
		for (int i = 1; i < n - j; ++i)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				exchange = 1;
			}
		}

		if (exchange == 0)//一趟下来exchange的值还为0,证明就没有发生交换,也就是已经有序
		{
			break;
		}
	}
}

1.3冒泡排序的特性总结

  1. 冒泡排序是一种非常容易理解的排序
  2. 时间复杂度: O(N^2) 最坏O(N^) 、最好O(N)
  3. 空间复杂度: O(1)
  4. 稳定性:稳定


2.快速排序👑

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。
其基本思想为: 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止


2.1hoare版本实现思想


排序前


排序中

①先选出一个基准值key(一般是最左边或者最右边)

②然后右边【L】先走找比key小的值,找到了就停下,然后再左边找比key大的值,找到了也停下
③然后交换这两个数
经过上面三步,就动图就变成了下面的样子
🥇

🥈


排序后

**由于是一个一个先走一个后走,肯定会出现相遇的时候,相遇就停下来。**相遇后将相遇坐标的值和基准值key交换,这时就完成了单趟的hoare排序


【这时的key其实就是在正确的位置上了】


相遇时如下图
🥉


2.2hoare版本快排源代码

复制代码
void QuickSort(int* a, int begin, int end)
{
	// 区间不存在,或者只有一个值则不需要在处理
	if (begin >= end)
	{
		return;
	}

	int left = begin, right = end;
	int keyi = left;
	while (left < right)
	{
		// 右边先走,找小
		while (left < right && a[right] >= a[keyi])
		{
			--right;
		}

		// 左边再走,找大
		while (left < right && a[left] <= a[keyi])
		{
			++left;
		}

		Swap(&a[left], &a[right]);
	}

	Swap(&a[keyi], &a[left]);
	keyi = left;

	// [begin, keyi-1] keyi [keyi+1, end]
	QuickSort(a, begin, keyi - 1);
	QuickSort(a, keyi+1, end);
}

2.3分析先走

为什么左边做key,右边先走。
右边做key,左边先走。
这样就可以保证相遇位置的值小余或者等于key


我这边拿左边做key,右边先走的情况来讲解。

情况1🥇


这个情况比较好理解,就是上面最后相遇位置的值,也就是3,比6要小


情况2🥈


这个情况如下图所示

这边也可以去画一下左边做key,左边先走的情况,会发现相遇位置的值不能保证比key要小



如果觉得文章不错,期待你的一键三连哦,你个鼓励是我创作的动力之源,让我们一起加油,顶峰相见!!!

🥇下期预告:快排的其他版本和非递归版本🥇

相关推荐
纪元A梦10 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
阿让啊11 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
深圳市快瞳科技有限公司11 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle11 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
superlls13 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻14 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦14 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
Florence2314 小时前
计算机组成原理:GPU架构、并行计算、内存层次结构等
c语言
Ripple1231215 小时前
数据结构:顺序表与链表
数据结构·链表
Jayden_Ruan15 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法