排序-选择排序(Selection Sort)冒泡排序(Bubble Sort)

目录

前言:

冒泡排序思路:

核心思想

时间复杂度:O(n^2)

代码如下:

选择排序思路

核心思想

时间复杂度:O(n^2)

代码如下:

选择排序优化思路:

优化代码如下:

排序稳定性比较

结语:


前言:

选择排序与冒泡排序比较简单,为补齐排序,就讲一下思路与时间复杂度,给一下代码。

然后补充一下所以排序的稳定性。

其他排序:

快速排序:排序-快速排序(Quick sort)(基础版)-CSDN博客

归并排序:排序-归并排序(Merge Sort)-CSDN博客

插入排序:排序---插入排序(Insertion Sort)-CSDN博客

希尔排序:排序-希尔排序(Shell Sort)-CSDN博客

冒泡排序思路:

核心思想

重复遍历数组,相邻元素两两比较,顺序错误则交换。每轮遍历后,最大元素"浮"到末尾。

冒泡排序有教学价值,但是时间复杂度比较高,使用少。

时间复杂度:O(n^2)

代码如下:

cpp 复制代码
void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; j++)
	{
		// 单趟
		int flag = 0;
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				flag = 1;
			}
		}

		if (flag == 0)
		{
			break;
		}
	}
}

选择排序思路

核心思想

每轮从未排序区间选出最小元素,放到已排序区间的开头。

时间复杂度:O(n^2)

不管怎么样时间复杂度都比较高,因为选择排序一直都是选择最小的拿出,

代码如下:

cpp 复制代码
void SelectionSort(int* a, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		int Min = i;
		for (int j = i + 1; j < n; j++)
		{
			if (a[Min] > a[j])
			{
				Min = j;
			}
		}
		swap(a[i], a[Min]);
		
	}
}

选择排序优化思路:

普通单向选择排序

每一轮只找最小值,放到数组最左边已排序位置,只处理一端。

这份双向选择排序逻辑

  1. 两个指针:begin(左端待排序起点),end(右端待排序终点)
  2. 一轮遍历区间 [begin, end],同时找出:
    • mini:当前区间最小值下标
    • maxi:当前区间最大值下标
  3. 把最小值交换到 a[begin];把最大值交换到 a[end]
  4. begin++ 左边界右移,end-- 右边界左缩,下一轮处理中间剩下的区间
  5. while(begin < end) 循环直到左右指针相遇,排序完成

优化代码如下:

cpp 复制代码
void SelectSort(int* a, int n)
{
	int begin = 0, end = n - 1;

	while (begin < end)
	{
		int mini = begin, maxi = begin;
		for (int i = begin + 1; i <= end; ++i)
		{
			if (a[i] > a[maxi])
			{
				maxi = i;
			}

			if (a[i] < a[mini])
			{
				mini = i;
			}
		}

		Swap(&a[begin], &a[mini]);
		Swap(&a[end], &a[maxi]);
		++begin;
		--end;
	}
}

排序稳定性比较

我这里只比较比较常见的七大排序:冒泡,快速,选择,插入,希尔,堆,归并。

|------|-----|
| 排序 | 稳定性 |
| 插入排序 | 稳定 |
| 希尔排序 | 不稳定 |
| 选择排序 | 不稳定 |
| 堆排序 | 不稳定 |
| 冒泡排序 | 稳定 |
| 快速排序 | 不稳定 |
| 归并排序 | 稳定 |

结语:

谢谢你的观看,希望可以给你提供帮助!!!

相关推荐
梦帮科技4 分钟前
量子张量网络破局大模型:从矩阵乘积态 (MPS) 到张量列 (TT-SVD) 低秩收缩全推导
网络·数据结构·数据库·线性代数·矩阵·架构·模拟退火算法
LOVE️YOU1 小时前
Python 数据结构的本质:位置、对象引用、Hash 与可变性
数据结构·python·哈希算法
不会就选b1 小时前
算法日常・每日刷题--<动态规划>1
java·数据结构·算法
shehuiyuelaiyuehao1 小时前
算法54,链表 两数相加
数据结构·算法·链表
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出弹子游戏机中数量为奇数的数字——只出现奇数次
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
阿狗童鞋4 小时前
数据结构与算法实战指南
数据结构·算法
垆边人似月.5 小时前
华为机考题:明明的随机数
数据结构·算法·华为
lusklusklusk5 小时前
Python 四大数据结构详解:元组、列表、集合、字典的特点与增删改查
数据结构·windows·python
keyipatience5 小时前
B树详解:从零构建平衡多路搜索树
数据结构·b树·算法·图搜索
FluxArt6 小时前
GPT Image 2.5 多图参考怎么用:Flux Art 生成与编辑教程
数据结构·gpt·算法