使用 TypeScript 实现算法处理

TypeScript 算法实现示例

快速排序算法实现

typescript 复制代码
/**
 * 使用快速排序算法对数字数组进行排序
 * @param arr 待排序的数字数组
 * @returns 排序后的新数组
 * 
 * 时间复杂度分析:
 * - 最佳/平均情况:O(n log n)
 * - 最坏情况(已排序数组):O(n²)
 * 空间复杂度:O(n)
 */
function quickSort(arr: number[]): number[] {
  // 基线条件:数组长度为0或1时直接返回
  if (arr.length <= 1) return arr;
  
  // 选择中间元素作为基准值(pivot)
  const pivot = arr[Math.floor(arr.length / 2)];
  
  // 将数组分为三部分:小于基准值、等于基准值和大于基准值
  const left = arr.filter(x => x < pivot);
  const middle = arr.filter(x => x === pivot);
  const right = arr.filter(x => x > pivot);

  // 递归排序左右两部分并合并结果
  return [...quickSort(left), ...middle, ...quickSort(right)];
}

二分搜索算法实现

typescript 复制代码
/**
 * 在已排序数组中执行二分查找
 * @param sortedArray 已排序的数字数组(升序)
 * @param target 要查找的目标值
 * @returns 目标值的索引,未找到返回-1
 * 
 * 时间复杂度:O(log n)
 * 空间复杂度:O(1)
 */
function binarySearch(sortedArray: number[], target: number): number {
  // 初始化搜索范围
  let left = 0;
  let right = sortedArray.length - 1;

  // 当搜索范围有效时循环
  while (left <= right) {
    // 计算中间索引
    const mid = Math.floor((left + right) / 2);
    
    // 检查中间元素
    if (sortedArray[mid] === target) {
      return mid; // 找到目标
    } else if (sortedArray[mid] < target) {
      left = mid + 1; // 搜索右半部分
    } else {
      right = mid - 1; // 搜索左半部分
    }
  }

  // 未找到目标
  return -1;
}

使用示例

typescript 复制代码
// 测试数据
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
console.log('Original array:', unsortedArray);

// 排序示例
const sortedArray = quickSort(unsortedArray);
console.log('Sorted array:', sortedArray);

// 搜索示例
const targets = [8, 1, 5]; // 包含存在和不存在的元素
targets.forEach(target => {
  const index = binarySearch(sortedArray, target);
  if (index !== -1) {
    console.log(`Found ${target} at index ${index}`);
  } else {
    console.log(`${target} not found in the array`);
  }
});

扩展应用场景

  1. 排序算法应用

    • 电商网站的商品价格排序
    • 学生成绩排名
    • 大数据处理前的数据预处理
  2. 搜索算法应用

    • 电话簿联系人查找
    • 字典单词查询
    • 游戏中的高分榜查找
  3. 性能优化建议

    • 对于小型数组(长度<10),插入排序可能更高效
    • 可以添加输入验证,确保数组只包含数字
    • 对于重复元素较多的情况,可以使用三向切分的快速排序变体
  4. 类型安全扩展

    typescript 复制代码
    // 泛型版本,支持更多数据类型
    function genericQuickSort<T>(arr: T[], compareFn: (a: T, b: T) => number): T[] {
      if (arr.length <= 1) return arr;
      
      const pivot = arr[Math.floor(arr.length / 2)];
      const left = arr.filter(x => compareFn(x, pivot) < 0);
      const middle = arr.filter(x => compareFn(x, pivot) === 0);
      const right = arr.filter(x => compareFn(x, pivot) > 0);
    
      return [...genericQuickSort(left, compareFn), ...middle, ...genericQuickSort(right, compareFn)];
    }
相关推荐
凡人叶枫16 分钟前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
学逆向的40 分钟前
C++纯虚函数
开发语言·c++·网络安全
kyriewen44 分钟前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
小和尚同志1 小时前
AI 自动化测试探索(一):Playwright MCP
前端·人工智能·aigc
程序员二叉1 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉1 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.01 小时前
在AI的帮助下理解spring的启动过程
java·前端·spring
徐小夕2 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
凡人叶枫2 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员2 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言