数据结构与算法篇-选择排序

选择排序

核心思路

统一视角:分治策略

  • 分:将数组划分为已排序部分和未排序部分;
  • 治:遍历未排序部分,解决单元素归位问题,增大已排序区间;

或者,更具体点:

  • 分:划分固定比例 1 : (n-1),即 [已排序 | 未排序];
  • 治:先解决单元素归位问题,再扩大已排序区间;
  • 性能:由于划分始终是线性 1 : n-1,路径深度为 n,故复杂度为 O(n^2);

核心逻辑:

  • 分:将数组划分为已排序部分和未排序部分;
  • 治:遍历未排序部分,找到未排序部分的最小值,将它与未排序部分的首元素交换

状态变化追踪

初始

  • 已排序部分:[0, -1]
  • 未排序部分:[0, n-1]

第1轮(i=0)

操作:从左向右遍历未排序部分[0, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。

结果

  • 已排序部分:[0, 0]
  • 未排序部分:[1, n-1]

第2轮(i=1)

操作:从左向右遍历未排序部分[1, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。

结果

  • 已排序部分:[0, 1]
  • 未排序部分:[2, n-1]

第k轮(i=k-1)

操作:从左向右遍历未排序部分[k-1, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。

结果

  • 已排序部分:[0, k-1]
  • 未排序部分:[k, n-1]

第n-1轮(i=n-2)

操作:从左向右遍历未排序部分[n-2, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。

结果

  • 已排序部分:[0, n-2]
  • 未排序部分:[n-1, n-1]

算法结束后

结果

  • 已排序区间:[0, n-1]
  • 未排序区间:[n, n-1],空集

实现

性质

  • 稳定性?
  • 原地性?
  • 自适应性?
  • 在线性?
相关推荐
烛衔溟2 个月前
C语言算法:排序算法入门
c语言·算法·排序算法·插入排序·冒泡排序·选择排序·多关键字排序
_DCG_10 个月前
选择排序算法
算法·排序算法·选择排序
y.Ghost10 个月前
C语言实现的常见排序算法
c语言·数据结构·排序算法·插入排序·冒泡排序·选择排序·快速排序
熬夜学编程的小王1 年前
【初阶数据结构篇】插入、希尔、选择、堆排序
数据结构·c++·插入排序·选择排序·希尔排序
KevinRay_1 年前
【数据结构入门】排序算法之插入排序与选择排序
排序算法·插入排序·堆排序·选择排序·希尔排序·算法稳定性
GGBondlctrl1 年前
【数据结构】关于冒泡排序,选择排序,插入排序,希尔排序,堆排序你到底了解多少???(超详解)
数据结构·排序算法·插入排序·冒泡排序·堆排序·选择排序·希尔排序
简 洁 冬冬1 年前
003 选择排序(lua)
lua·选择排序
编程版小新2 年前
数据结构:冒泡排序,选择排序,插入排序,希尔排序的实现分析
数据结构·排序算法·插入排序·冒泡排序·选择排序·希尔排序
时差freebright2 年前
【排序算法】第二章:选择排序----普通选择排序与堆排序的详解和对比
c语言·数据结构·算法·排序算法·堆排序·选择排序