数据结构和算法|排序算法系列(一)|选择排序

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知:
《Hello算法之排序算法》

主要内容来自:Hello算法11.2 选择排序

选择排序是明显的基于比较的排序。下文开始阐述选择排序的整个算法流程

算法流程

选择排序应该已经是最简单的排序方法了:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序区间的末尾。

整个算法流程可以移步:Hello算法11.2 选择排序

设数组的长度为 n n n,整个流程如下:

  1. 初始状态下,所有元素未排序,即未排序(索引)区间为 [ 0 , n − 1 ] [0,n-1] [0,n−1]
  2. 选取区间 [ 0 , n − 1 ] [0,n-1] [0,n−1]中的最小元素,将其与索引 0 处的元素交换。完成后,数组前 1 个元素已完成排序;
  3. 随后选取区间 [ 1 , n − 1 ] [1,n-1] [1,n−1]中的最小元素,将其与索引 1 处的元素交换。完成后,数组前 2 个元素已完成排序;
  4. 以此类推。经过 n - 1轮选择与交换后,数组的前n - 1个元素已完成排序。
  5. 剩下的最后一个元素必定是最大元素,无须排序。
cpp 复制代码
void selectionSort(vector<int> &nums) {
	int n = nums.size();
	// 外循环:未排序区间为 [i, n-1]
	for (int i = 0; i < n - 1; i++) {
		//内循环:找到未排序区间内的最小元素
		int k = i;
		for (int j = i + 1; j < n; j++) {
			if (nums[j] < nums[k])
				k = j; //记录最小元素的索引
		}
		//将该最小元素与未排序区间的首个元素交换
		swap(nums[i], nums[k]);
	}
}

算法特性

  • 时间复杂度为 O ( n 2 ) O(n^2) O(n2)、非自适应排序
cpp 复制代码
	for (int i = 0; i < n - 1; i++) {
		...
		for (int j = i + 1; j < n; j++) {
			...
		}
		...
	}

从这里可以看出,外循环一共有 n − 1 n-1 n−1轮,第一轮的为排序区间长度为n,最后一轮未排序区间长度为2,所以各论循环分别包含 n 、 n − 1 、 . . . 、 3 、 2 n、n-1、...、3、2 n、n−1、...、3、2轮内循环。这是一个等比数列,所以和为
( n − 1 ) ( n + 2 ) 2 \frac{(n-1)(n+2)}{2} 2(n−1)(n+2)

  • 空间复杂度为 O ( 1 ) O(1) O(1)、原地排序
  • 非稳定排序
    非稳定排序值得就是,对于某个元素nums[i]有可能被交换至与其相等的元素的右边,导致两者的相对顺序发生变化。
相关推荐
神经网络的应用34 分钟前
C++程序设计例题——第三章程序控制结构
c++·学习·算法
南宫生1 小时前
力扣-数据结构-3【算法学习day.74】
java·数据结构·学习·算法·leetcode
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇30】C#常用泛型数据结构类——list<T>列表、`List<T>` 和数组 (`T[]`) 的选择
java·开发语言·数据结构·unity·c#·游戏引擎·list
A懿轩A1 小时前
C/C++ 数据结构与算法【树和二叉树】 树和二叉树,二叉树先中后序遍历详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·二叉树·
-$_$-2 小时前
【LeetCode 面试经典150题】详细题解之滑动窗口篇
算法·leetcode·面试
Channing Lewis2 小时前
算法工程化工程师
算法
帅逼码农3 小时前
有限域、伽罗瓦域、扩域、素域、代数扩张、分裂域概念解释
算法·有限域·伽罗瓦域
Jayen H3 小时前
【优选算法】盛最多水的容器
算法
机跃3 小时前
递归算法常见问题(Java)
java·开发语言·算法
<但凡.3 小时前
题海拾贝:蓝桥杯 2020 省AB 乘法表
c++·算法·蓝桥杯