/**
* 插入排序算法
* @param {Array<number>} arr 待排序的数组
* @returns {Array<number>} 排序后的数组
*/
function insertionSort(arr) {
const n = arr.length;
if (n <= 1) {
return arr; // 空数组或只有一个元素的数组无需排序
}
for (let i = 1; i < n; i++) {
let key = arr[i]; // 当前要插入的元素
let j = i - 1;
// 将比 key 大的元素向后移动一位
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
// 将 key 插入到正确的位置
arr[j + 1] = key;
}
return arr;
}
// 示例用法:
const unsortedArray = [5, 2, 4, 6, 1, 3];
const sortedArray = insertionSort(unsortedArray);
console.log(sortedArray); // 输出: [1, 2, 3, 4, 5, 6]
/**
* 插入排序算法解释:
*
* 1. 从第二个元素开始,将当前元素视为 key。
* 2. 将 key 与它之前的元素逐个比较。
* 3. 如果前面的元素比 key 大,则将该元素向后移动一位。
* 4. 重复步骤 3,直到找到 key 的正确位置(即前面的元素都比 key 小或者到达数组的开头)。
* 5. 将 key 插入到正确的位置。
* 6. 重复步骤 1-5,直到遍历完整个数组。
*/
/**
* 时间复杂度:
* - 最好情况:数组已经排好序,每次只需要比较一次,无需移动元素。时间复杂度为 O(n)。
* - 最坏情况:数组逆序排列,每次都需要将 key 与它之前的每个元素比较并移动。时间复杂度为 O(n^2)。
* - 平均情况:时间复杂度为 O(n^2)。
*
* 空间复杂度:
* - 插入排序是原地排序算法,只需要常数个额外空间来存储临时变量。空间复杂度为 O(1)。
*/
代码改进及补充说明:
- 错误处理: 可以添加对输入参数的校验,例如检查
arr
是否为数组,以及数组元素是否为数字。 - 泛型支持 (TypeScript): 如果使用 TypeScript,可以考虑使用泛型来支持不同数据类型的排序,例如:
function insertionSort<T>(arr: T[], compareFn: (a: T, b: T) => number): T[] {
// ... (implementation using compareFn for comparisons)
}
这样就可以自定义比较函数 compareFn
来实现对不同类型数据的排序,例如字符串、对象等。
这个改进版的代码更加健壮,并且更符合前端开发中对类型安全和代码可读性的要求。 理解时间和空间复杂度对于评估算法效率至关重要。插入排序虽然在小规模数据上表现良好,但在大型数据集上效率较低,这时可以考虑使用更高效的排序算法,例如快速排序或归并排序。
标签:arr,数组,复杂度,算法,key,排序,插入排序 From: https://www.cnblogs.com/ai888/p/18578023