以
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`);
}
});
扩展应用场景
-
排序算法应用:
- 电商网站的商品价格排序
- 学生成绩排名
- 大数据处理前的数据预处理
-
搜索算法应用:
- 电话簿联系人查找
- 字典单词查询
- 游戏中的高分榜查找
-
性能优化建议:
- 对于小型数组(长度<10),插入排序可能更高效
- 可以添加输入验证,确保数组只包含数字
- 对于重复元素较多的情况,可以使用三向切分的快速排序变体
-
类型安全扩展:
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)]; }