可视化的
数据结构与算法
使用Vue3 + Vite + TypeScript + Pinia编写开始学习数据结构
计算机存储、组织数据的方式经典排序算法
根据不同数据结构对无序元素进行有序化的计算方法
冒泡排序
每次循环找出目前数组中最大的数,放在当前数组末尾
鸡尾酒排序
双向冒泡,来回扫描两端收缩,尾部小元素一趟到家,零交换提前收工%20--%3e%3cg%20stroke='%232e7d32'%20stroke-width='22'%20fill='%232e7d32'%3e%3cline%20x1='280'%20y1='220'%20x2='280'%20y2='420'%20/%3e%3ccircle%20cx='280'%20cy='220'%20r='30'%20/%3e%3ccircle%20cx='280'%20cy='420'%20r='30'%20/%3e%3cline%20x1='360'%20y1='620'%20x2='360'%20y2='820'%20/%3e%3ccircle%20cx='360'%20cy='620'%20r='30'%20/%3e%3ccircle%20cx='360'%20cy='820'%20r='30'%20/%3e%3c/g%3e%3c!--%20列%202(琥珀=当前)%20--%3e%3cg%20stroke='%23f0a000'%20stroke-width='24'%20fill='%23f0a000'%3e%3cline%20x1='600'%20y1='220'%20x2='600'%20y2='620'%20/%3e%3ccircle%20cx='600'%20cy='220'%20r='32'%20/%3e%3ccircle%20cx='600'%20cy='620'%20r='32'%20/%3e%3cline%20x1='700'%20y1='420'%20x2='700'%20y2='820'%20/%3e%3ccircle%20cx='700'%20cy='420'%20r='32'%20/%3e%3ccircle%20cx='700'%20cy='820'%20r='32'%20/%3e%3c/g%3e%3c!--%20列%203(灰=未执行)%20--%3e%3cg%20stroke='%23b9c6bd'%20stroke-width='20'%20fill='%23b9c6bd'%3e%3cline%20x1='870'%20y1='220'%20x2='870'%20y2='420'%20/%3e%3ccircle%20cx='870'%20cy='220'%20r='28'%20/%3e%3ccircle%20cx='870'%20cy='420'%20r='28'%20/%3e%3cline%20x1='870'%20y1='620'%20x2='870'%20y2='820'%20/%3e%3ccircle%20cx='870'%20cy='620'%20r='28'%20/%3e%3ccircle%20cx='870'%20cy='820'%20r='28'%20/%3e%3c/g%3e%3c/svg%3e)
双调排序
排序网络:比较器位置与数据无关、同列可并行执行,先构造双调序列再距离减半合并,深度 O(log²n),GPU 排序思想根基
选择排序
每次循环找出目前数组中最小的数,放在当前数组头部
插入排序
顺序遍历数组每一个数字,然后和该数字前面的数组比较,将其放在适当的位置'%20/%3e%3c/svg%3e)
二分插入排序
插入排序变体,在已排序前缀里折半查找插入点,比较降到对数级,搬移不变保稳定
希尔排序
核心是一个插入排序,步进数1改为数组长度的一半,每完成一次步进都减小一半
归并排序
通过递归构建二叉树结构,然进行左右两个节点的有序数组合并。
自顶向下归并
递归分治版归并,对半下钻回程合并,配递归调用栈看分治全程,与迭代版对照
快速排序
选取一个基准数,将比它小的放在前面,比它大的放在后面,左右两部分重复这一过程
三路快排
荷兰国旗划分,把数组分成小于/等于/大于基准三段,等值元素一次归位,治大量重复
双轴快排
两个基准一趟分三段,递归更浅缓存更友好,Java Arrays.sort 基本类型实际采用
堆排序
利用大顶堆性质每次找出最大的数放在末尾,然后重复构造和维护大顶堆
计数排序
在已知取值范围的情况下,按照一种萝卜一个坑的思想进行排序
基数排序
不比较大小,按位(个位→十位…)反复分配到 10 个桶再收集,线性时间
桶排序
按值域把元素撒进若干桶,桶内各自排序后按桶序合并,均匀分布时近线性图算法
在图(点 + 边)上求解的算法,如最短路、连通性、最小生成树动态规划
把大问题拆成子问题、子问题的解填进表格、后面直接查表复用——「填表」范式回溯与搜索
一步步做选择、错了就退回重来——递归试探 + 剪枝 + 回溯地搜索解空间字符串
在文本里查找、比对、处理模式串——编辑器查找、grep、DNA 比对的底层算法数学与数论
与整数、素数、模运算打交道的算法——从「把大问题拆成数的性质」出发计算几何
在平面/空间上用坐标和向量处理点、线、多边形——「几何问题代数化」的算法查找
在有序或结构化数据里高效定位目标——每一步扔掉不可能的区域