当前位置: 首页 > news >正文

1.1.2.1 选择 + 冒泡排序

选择排序

1. 原理

0 ~ N-1min 放到 N-1位置  最小数
0 ~ N-2min 放到 N-2位置  次小数
0 ~ N-3min 放到 N-3位置  次次小数
...
0 ~ 1min 放到 1位置  次次小数
时间复杂度: 多少次常数操作??0 ~ N-1min 放到 N-1位置  最小数     N眼 + N比 1次swap
0 ~ N-2min 放到 N-2位置  次小数     N-1+ N-11次swap
0 ~ N-3min 放到 N-3位置  次次小数   N-2+ N-21次swap
...
0 ~ 1min 放到 1位置  次次小数看:N + N-1 + N-2 + N-3+... +1: N + N-1 + N-2 + N-3+... +1
swap: N
= aN**2 + bN + C1. 拆分原则:常数操作级别,
2. 时间复杂度优劣: 不要低阶项,常数项,高阶系数; 最后拆分到常数操作级别
3. 当N很大时, 低阶、常数项影响很小
4. 如果 a、b算法的时间复杂度同一个级别, 拼常数项(大样本验证)。
5. 选择、冒泡、插入的时间复杂度为O(N^2)选择排序适用于少量数据的排序。每次从未排序的部分中选择最小(或最大)的元素,将其放到已排序部分的末尾。
选择排序是一种不稳定的排序算法,但它具有 O(1) 的空间复杂度。选择排序的原理
选择排序的基本思想是将数组分成两个部分:已排序部分和未排序部分。
1. 初始状态:已排序部分为空,未排序部分包含整个数组。
2. 从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。
3. 重复步骤 2,直到未排序部分为空。选择排序的时间复杂度
最坏情况时间复杂度:O(n^2),因为每次选择最小元素都需要遍历未排序部分。
最佳情况时间复杂度:O(n^2),即使数组已经有序,仍然需要遍历未排序部分。
平均情况时间复杂度:O(n^2)。
选择排序的空间复杂度 O(1)。选择排序是不稳定的排序算法,因为相等元素的相对顺序可能会改变。例如,如果在选择过程中交换了两个相等元素的位置,那么它们的相对顺序就会改变。

2. code

def selectionSort(arr):if len(arr) < 2:returnlens = len(arr)for i in range(0, lens-1):  # 0~lens-2的index都要更新最小值minIndex = i            # 确定第 i个位置的值for j in range(i+1, lens):if arr[minIndex] > arr[j]:   # 不断更新第 i 个位置的最小值对应的索引minIndex = j   # 如果当前值更小则更新最小值的索引swap(arr, i, minIndex)    # 交换returndef selection_sortxx(arr):n = len(arr)for i in range(n):# 假设当前元素是最小的min_idx = ifor j in range(i + 1, n):if arr[j] < arr[min_idx]:min_idx = j# 交换找到的最小元素和当前元素arr[i], arr[min_idx] = arr[min_idx], arr[i]return arr# for test
def main():testTime = 500000maxSize = 100maxValue = 100succeed = Truefor i in range(testTime):arr1 = generateRandomArray(maxSize, maxValue)arr2 = copyArray(arr1)selectionSort(arr1)comparator(arr2)if (not isEqual(arr1, arr2)):succeed = FalseprintArray(arr1)printArray(arr2)breakprint(i, succeed)if succeed:print("Nice!")else:print("Fucking fucked!")arr = generateRandomArray(maxSize, maxValue)printArray(arr)selectionSort(arr)printArray(arr)if __name__ == '__main__':main()

http://www.mrgr.cn/news/82633.html

相关文章:

  • 我用Ai学Android Jetpack Compose之TextField
  • win32汇编环境,在窗口程序中画五边形与六边形
  • 公共数据授权运营机制建设(六大机制、存在问题、发展路径)
  • qt creator 14.0.1 调试过程重查看变量在内存中的值十六进制值
  • 【Android项目学习】3. MVVMHabit
  • jenkins插件下载和从gitlab中拉取文件传送到虚拟机中
  • Oracle 11g rac + Dataguard 环境调整 redo log 大小
  • 与 Oracle Dataguard 相关的进程及作用分析
  • 1.1.7 master公式的使用
  • 1.2.1 归并排序
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)
  • 三子棋游戏
  • web漏洞之文件包含漏洞
  • 模型训练二三事:参数个数、小批量、学习率衰减、输入形状
  • SCAU期末笔记 - 数据库系统概念往年试卷解析
  • MyBatis执行一条sql语句的流程(源码解析)
  • 域上的多项式环,整除,相通,互质
  • 【精读电影】至暗时刻
  • unity-入门查漏补缺0.2.02.07
  • RocketMQ场景使用
  • window11 wsl mysql8 错误分析:1698 - Access denied for user ‘root‘@‘kong.mshome.net‘
  • RocketMQ使用场景问题
  • Eplan 项目结构(高层代号、安装地点、位置代号)
  • MySQL Binlog 监听方案
  • 智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之20 再次重建 之5 项目文件三大部 整“拼”项目文档总述
  • 保姆级教程Docker部署ClickHouse镜像