排序算法:选择排序

2023-05-16

1. 什么是选择排序?(摘抄自百度百科)

选择排序(Selection sort)是一种简单直观的排序算法。

它的工作原理是:

第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

以此类推,直到全部待排序的数据元素的个数为零。

选择排序是不稳定的排序方法。

2.选择排序算法实现(摘抄自百度百科(C语言版伪代码))

void selectionsort(int n, keytype S[])
{
	index i, j, smallest;
	for (i = 1; i <= n - 1; i++) {
		smallest = i;
		for (j = i + 1; j <= n; j++)
			if (S[j] < S[smallest])
				smallest = j;
		exchange S[i] and S[smallest];
	}
}

下面进行讲解上面的程序:

1. 定义索引变量:i(外循环索引变量),j(内循环索引变量),smallest(最小值索引变量)

2. 通过for进行数组的外循环,遍历次数为整个数组的长度

3. 初始化最小值索引变量(smallest)为当前外循环索引值(i)

4. 通过for进行数组的内循环,起始索引为当前外循环索引值

5. 比较内循环索引变量(j)和最小值索引变量(smallest)的数值元素的值,选出最小值的索引,然后保存索引到最小值索引变量(smallest)

6. 每次内循环结束后,将最小值索引(smallest)和当前外循环索引(i)的元素进行交换,确保当前外循环索引(i)后面的元素都比自身小

动画解释

图解:

第一次循环

当前外循环索引(i)为0

初始化最小值索引(smallest)为当前外循环索引(i) 为 0

进入内循环,内循环索引(j)为当前外循环索引(i) + 1,当前内循环索引为 i + 1  => 0 + 1  => 1

内循环索引(j)为1,  最小值索引(smallest)为0

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(1)] < S[smallest(0)])   => if (5 < 3),条件为 false,继续执行

内循环索引(j)为2,  最小值索引(smallest)为0

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(2)] < S[smallest(0)])   => if (1 < 3),条件为 true,执行索引交换

交换后,最小值索引(smallest)为当前内循环索引(j),最小值索引(smallest)为2

内循环索引(j)为3,  最小值索引(smallest)为2

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(3)] < S[smallest(2)])   => if (-7 < 1),条件为 true,执行索引交换

交换后,最小值索引(smallest)为当前内循环索引(j),最小值索引(smallest)为3

内循环索引(j)为4,  最小值索引(smallest)为3

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(4)] < S[smallest(3)])   => if (4 < -7),条件为 false,继续执行

内循环索引(j)为5,  最小值索引(smallest)为3

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(5)] < S[smallest(3)])   => if (9 < -7),条件为 false,继续执行

内循环索引(j)为6,  最小值索引(smallest)为3

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(6)] < S[smallest(3)])   => if (-6 < -7),条件为 false,继续执行

内循环索引(j)为7,  最小值索引(smallest)为3

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(7)] < S[smallest(3)])   => if (8 < -7),条件为 false,继续执行

内循环索引(j)为8,  最小值索引(smallest)为3

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(8)] < S[smallest(3)])   => if (10 < -7),条件为 false,继续执行

内循环索引(j)为9,  最小值索引(smallest)为3

进行条件判断,if (S[j] < S[smallest])   =>  if (S[j(9)] < S[smallest(3)])   => if (4 < -7),条件为 false,继续执行

内循环结束,进行交换元素,exchange S[i] and S[smallest];

当前外循环索引(i)为0,最小值索引(smallest)为3

进行交换数组中0和3的元素,交换后的数组

下一次循环

外循环索引(i)为1,最小值索引(smallest)为1,内循环索引(j)为当前外循环索引(i) + 1,当前内循环索引为 i + 1  => 1 + 1  => 2

继续内循环查找最小值索引,然后与外循环索引(i)元素互换,以达到升序排序数组

如需降序排序数组则查找最大值进行交换

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法:选择排序 的相关文章

  • 剑指offer(简单)

    目录 数组中重复的数字 替换空格 从尾到头打印链表 用两个栈实现队列 斐波那契数列 青蛙跳台阶问题 旋转数组的最小数字 二进制中的1的个数 打印从1到最大的n位数 删除链表的节点 调整数组顺序使奇数位于偶数前面 链表中倒数第k个节点 反转链
  • 剑指 Offer 53 - I. 在排序数组中查找数字 I

    剑指 Offer 53 I 在排序数组中查找数字 I 题目 题目链接 具体代码 题目 题目链接 https leetcode cn com problems zai pai xu shu zu zhong cha zhao shu zi l
  • 归并排序(递归,非递归)

    目录 写在前面的话 一 归并思想 二 归并排序递归实现 2 1思想实现 2 2排序实现 2 3代码实现 三 归并排序非递归实现 3 1思路实现 小区间优化 3 2边界值处理 3 2代码实现 写在前面的话 小伙伴们大家好啊 今天依旧小菜鸡库森
  • 排序算法——比较类排序算法讲解以及c++实现

    首先我先抛一个老哥的博客 我是看着他的博客来学习理解 地址 https www cnblogs com onepixel p 7674659 html 首先说一下排序算法分为2类 一类是比较类排序算法 另一类是非比较类排序 这里主要讲常用的
  • 归并排序(分析与模板)

    归并排序 思路 1 确定分界元素mid left right 2 2 递归分解数组 两两组合组成两个有序数组 3 归并 合二为一 int temp 100010 merge sort int num int l int r if l gt
  • 二分查找4 - 搜索旋转排序数组

    搜索旋转数组 1 题目 整数数组 nums 按升序排列 数组中的值 互不相同 在传递给函数之前 nums 在预先未知的某个下标 k 0 lt k lt nums length 上进行了 旋转 使数组变为 nums k nums k 1 nu
  • 快速排序————非递归实现

    二 递归实现快速排序 2 1 为什么我们要去通过递归实现我们的快速排序呢 大家有可能会想是不是因为递归非常的占用空间 我们都知道我们的局部变量是保存在栈上的我们的函数参数也是在栈上开辟的 所以说递归是不是会占用我们非常多的栈空间 同时呢我们
  • 七大经典排序算法总结【详解】

    排序算法的分类 插入排序 选择排序 交换排序 归并排序 具体分类如图所示 这七种排序算法在我们生活中应用非常广泛 所用的场景各有不同 他的时间复杂度和空间复杂度也是不同的 一 插入排序 初始数据越接近有序 时间效率越高 1 直接插入排序 直
  • 【数据结构】——八大排序

    文章目录 1 插入排序 2 冒泡排序 3 希尔排序 4 选择排序 5 快速排序 快排优化 递归改非递归 6 堆排序 7 归并排序 递归归并排序 改成非递归 8 计数排序 9 题目 总结 排序的时间检验 对于不同排序的时间复杂度分析 1 插入
  • 8-13外部排序-败者树

    败者树是树形选择排序的一种变体 可视为一棵完全二叉树 通过败者树 可以在k个归并段中选出最小关键字所需要的关键字对比次数更少 绿色为叶子结点 存放初始数据 黑色为失败结点 蓝色为胜出结点 一 基本过程 以下按从小到大的方式构建 1 从8个归
  • 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航 1 稳定性 2 插入排序 3 希尔排序 4 选择排序 5 堆排序 6 冒泡排序 1 稳定性 两个相等的数据 如果经过排序后 排序算法能保证其相对位置不发生变化 则我们称该算法是具备稳定性的排序算法 图中排序后a仍然在b前面 此时这
  • 【数据结构】排序(直接插入、折半插入、希尔、冒泡、快速、直接选择、堆、归并、基数排序)

    一 什么是排序 排序 将一组杂乱无章的数据按一定规律顺次排列起来 即 将无序序列的数据节点包含多个数据域 那么排序往往是针对其中某个域而言 二 排序方法的分类 1 按数据存储介质可分为 内部排序 数据量不大 数据在内存 无需内外存交换数据
  • 插入排序总结

    插入排序 Insertion Sort 的算法描述是一种简单直观的排序算法 它的工作原理是通过构建有序序列 对于未排序数据 在已排序序列中从后向前扫描 找到相应位置并插入 排序思路 假设按照升序排序 1 从索引为1的元素开始向前比较 一旦前
  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • QString转const char*

    QString str hello world 转成const char const char arr str toStdString c str const char arr str toLatin1 constData toUtf8 转
  • LeetCode -- 1833. 雪糕的最大数量

    使用的算法 计数排序 贪心算法 计数排序 1 基于比较的排序算法 2 在对一定范围内的整数排序时 它的复杂度为 n k 其中k是整数的范围 快于任何比较排序算法 当O k gt O nlog n 的时候其效率反而不如基于比较的排序 基于比较
  • 分治-归并排序

    文章目录 315 计算右侧小于当前元素的个数 1 题目 2 算法原理 3 代码实现 493 翻转对
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 冒泡排序/选择排序/插入排序/快速排序/归并排序/桶排序/堆排序/希尔排序/计数排序/基数排序/二分查找/广度优先搜索/深度优先搜索

    排序算法 冒泡排序 Bubble Sort 通过重复地比较相邻的元素并交换它们 使得最大 或最小 的元素逐渐移动到列表的一端 从而实现排序 选择排序 Selection Sort 在未排序的部分中 选择最小 或最大 的元素 并将其放置在已排

随机推荐