Categories
Tags
Ai 生成 API学习 API简化 api请求 API调用 best-practices Blogging Caching catchTag catchTags class CLI Config context Context Context.Tag CSS Customization Demo development DocC Docker dual API Effect effect Effect.Service Effect.succeed Example extension ffmpeg filterOrFail flatMap Fuwari gen generator grep hooks HTML HTTP响应 IDE自动补全 iOS javascript JavaScript Javascript Layer.effect Layer.provide Layers Linux Markdown Mock n8n Next.js ParseError pipe pokemon PostCSS process.env progress Promise promise provideService PWA react React React Hook Form React Query React Router react-native Scheduler Schema Schema.Class security Service Worker Services SSR state-management suspense Tagged Errors TaggedError TanStack Query TanStack Start tips tryPromise tsconfig TypeScript typescript Video VS Code vscode Web API Web Development yield yt-dlp Zod 不透明类型 二叉树 代码组织 任务调度 优先级 使用服务 依赖注入 依赖管理 值语义 入门教程 最佳实践 最小堆 函数式编程 函数组合 前端 前端开发 副作用 副作用控制 可视化 可组合性 可维护性 可访问性 命令行 响应过滤 多个错误 实现 实践指南 层 层依赖 层组合 工具链 并发控制 应用架构 延迟执行 开发技巧 开发教程 开源 异步处理 异步操作 异步编程 性能优化 手写系列 排序 接口设计 插件开发 数据结构 数据获取 数据解码 数据验证 无限滚动 日历 日志分析 服务 服务依赖 服务定义 服务实现 服务提供 测试 源码分析 状态管理 环境变量 生成器 离线支持 程序分离 算法 类型安全 类型定义 类型推断 类型系统 类定义 线性代码 组合 翻译 自动化 自定义错误 表单验证 记忆化 设计模式 语义化 运维 运行时验证 部分应用 配置 配置变量 配置服务 配置管理 重构 错误处理 错误定义 错误恢复 项目设置
501 words
3 minutes
常见排序算法详解与实现
冒泡排序 (Bubble Sort)
冒泡排序是最简单直观的排序算法之一。它重复地遍历要排序的数组,比较相邻元素,如果顺序错误则交换它们。 这个过程会不断重复,直到没有再需要交换的元素,也就是数组已经排序完成。
时间复杂度: O(n²) - 最坏情况、平均情况 空间复杂度: O(1) 稳定性: 稳定
import { swap } from './swap';
export function bubbleSort(arr: number[]) {
let swaped = false;
const length = arr.length;
for (let j = length; j > 0; j--) {
for (let i = 1; i < j; i++) {
if (arr[i - 1] > arr[i]) {
swaped = true;
swap(arr, i - 1, i);
}
}
if (!swaped) {
return;
}
swaped = false;
}
}选择排序 (Selection Sort)
选择排序是一种简单直观的排序算法。它的工作原理是每次从未排序区间中找到最小元素, 将其放到已排序区间的末尾。算法维护两个子数组:已排序子数组和未排序子数组。
时间复杂度: O(n²) - 最坏情况、平均情况、最好情况 空间复杂度: O(1) 稳定性: 不稳定
import { swap } from './swap';
export function selectionSort(arr: number[]) {
for (let i = 0; i < arr.length - 1; i++) {
let min = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
if (i !== min) {
swap(arr, i, min);
}
}
}插入排序 (Insertion Sort)
插入排序的工作方式类似于我们整理一手扑克牌。开始时,我们的左手为空,牌面朝下放在桌上。 然后,我们每次从桌上拿走一张牌,并将它插入左手中正确的位置。为了找到这个位置,我们从右到左将它与已在手中的牌进行比较。
时间复杂度: O(n²) - 最坏情况、平均情况;O(n) - 最好情况(已排序) 空间复杂度: O(1) 稳定性: 稳定
export function insertion_sort(arr: number[]) {
for (let j = 1; j < arr.length; j++) {
const target = arr[j];
let i = j - 1;
while (i >= 0 && arr[i] > target) {
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = target;
}
}希尔排序 (Shell Sort)
希尔排序是插入排序的一种改进版本。它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小, 直到只比较相邻元素的最后一趟排序为止。这种方法可以显著减少小元素需要移动的次数。
时间复杂度: 取决于间隔序列,一般为O(n log² n) 空间复杂度: O(1) 稳定性: 不稳定
import { swap } from './swap';
export function shell_sort(nums: number[]) {
let h = 1;
const length = nums.length;
while (h < length / 3) {
h = h * 3 + 1;
}
while (h >= 1) {
for (let j = h; j < length; j++) {
for (let i = j; i >= h && nums[i - h] > nums[i]; i = i - h) {
swap(nums, i, i - h);
}
}
h = Math.floor(h / 3);
}
return nums;
}常见排序算法详解与实现
https://0bipinnata0.my/posts/algorithm/sort/