插入排序实现思路:将一个新的数,和前面的比较,只要当前数小于前一个则和前一个交换位置,否则终止;
「时间复杂度:O(N^2);」
「空间复杂度:O(1)」
function insertSort(arr) {
// 检查输入是否为数组且不为空
if (!Array.isArray(arr) || arr.length <= 0) {
return [];
}
// 定义交换函数
const swap = (arr, i, j) => {
const temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
};
// 插入排序
for (let i = 1; i < arr.length; i++) {
for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
swap(arr, j, j + 1);
}
}
return arr;
}
插入排序的实现原理是将一个数组分为已排序区间和未排序区间,每次从未排序区间中取出一个元素,将其插入到已排序区间中的合适位置,直到未排序区间为空。具体实现过程如下:
插入排序的优点是实现简单,代码量小,适用于小规模数据的排序。缺点是时间复杂度为O(n^2),不适用于大规模数据的排序。
function insertSort(arr) {
for (let i = 1; i < arr.length; i++) { // 从第二个元素开始遍历
let j = i - 1; // 定义一个指针,指向当前元素的前一个元素
const temp = arr[i]; // 将当前元素存储到temp中
while (j >= 0 && arr[j] > temp) { // 如果指针没有越界并且前一个元素大于当前元素
arr[j + 1] = arr[j]; // 将前一个元素向右移动一位
j--; // 指针向左移动一位
}
arr[j + 1] = temp; // 将当前元素插入到正确的位置
}
return arr; // 返回排序后的数组
}
第一段代码是标准的插入排序实现,它使用一个指针j来指向当前元素的前一个元素,然后将当前元素插入到正确的位置。具体来说,它从第二个元素开始遍历,将当前元素存储到temp中,然后将指针j向左移动,直到指针越界或者前一个元素小于等于当前元素,然后将当前元素插入到j+1的位置。
第二段代码也是插入排序的实现,但是它使用了交换函数来交换元素的位置。具体来说,它从第二个元素开始遍历,然后将当前元素与前一个元素比较,如果前一个元素大于当前元素,就交换它们的位置,直到当前元素插入到正确的位置。
总的来说,这两段代码的实现思路是一样的,都是将当前元素插入到已经排好序的部分中。但是第一段代码使用了一个指针来指向当前元素的前一个元素,然后将当前元素插入到正确的位置,而第二段代码使用了交换函数来交换元素的位置。
const arr1 = [3, 0, 2, 5, -1, 4, 1];
console.log(insertSort(arr4)); // [-1, 0, 1, 2, 3, 4, 5]
const arr2 = [1, 2, 3, 4, 5];
console.log(insertSort(arr5)); // [1, 2, 3, 4, 5]
const arr3 = [5, 4, 3, 2, 1];
console.log(insertSort(arr6)); // [1, 2, 3, 4, 5]