从头理解:插入排序算法的奥妙
2023-11-23 11:53:17
插入排序的思想:分而治之,逐个击破
插入排序的核心思想是将待排序的元素一个一个地插入到已经排序好的序列中,就像在纸牌游戏中,将一张新牌插入到已经排序好的牌堆中一样。
算法首先将待排序的元素分为两部分:已排序的部分和未排序的部分。然后,算法从第二个元素开始,将每个未排序的元素与已排序部分中的元素进行比较,找到合适的插入位置,并将该元素插入到该位置。如此循环,直到所有元素都被插入到已排序的部分,排序过程完成。
图解插入排序过程,深入理解算法精髓
让我们用一个具体的例子来演示插入排序的过程。假设我们有一个数组[5, 3, 1, 2, 4],我们需要对它进行排序。
步骤1: 将数组分为已排序的部分和未排序的部分。已排序的部分只有一个元素,也就是数组的第一个元素5。未排序的部分包含数组的其余元素,即3, 1, 2, 4。
步骤2: 将第二个元素3与已排序的部分进行比较。3小于5,所以将3插入到5的前面。现在已排序的部分包含两个元素,分别是3和5。未排序的部分包含数组的其余元素,即1, 2, 4。
步骤3: 将第三个元素1与已排序的部分进行比较。1小于3和5,所以将1插入到3的前面。现在已排序的部分包含三个元素,分别是1, 3和5。未排序的部分包含数组的其余元素,即2和4。
步骤4: 将第四个元素2与已排序的部分进行比较。2大于1和3,小于5,所以将2插入到3和5的中间。现在已排序的部分包含四个元素,分别是1, 2, 3和5。未排序的部分只剩下最后一个元素4。
步骤5: 将最后一个元素4与已排序的部分进行比较。4大于1, 2和3,小于5,所以将4插入到5的前面。现在已排序的部分包含五个元素,分别是1, 2, 3, 4和5。未排序的部分已经为空,排序过程完成。
分析插入排序的性能和稳定性
插入排序的平均时间复杂度为O(n^2),最坏时间复杂度也是O(n^2)。当数组已经基本有序时,插入排序的性能最佳,此时的时间复杂度为O(n)。
插入排序是一种稳定的排序算法,这意味着如果两个元素在排序前的顺序相同,那么排序后它们的顺序也相同。这对于某些特定的应用场景非常重要,例如当元素具有固有的顺序时,比如学生成绩的排名。
代码实现插入排序算法,轻松掌握算法精髓
以下是使用JavaScript实现插入排序算法的代码示例:
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let current = arr[i];
let j = i - 1;
while (j >= 0 && current < arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = current;
}
return arr;
}
总结
插入排序是一种简单易懂、实现方便的基本排序算法。它适用于小型数据集,或者已经基本有序的数据集。虽然它的时间复杂度为O(n^2),但由于其简单的实现和较好的局部性,在某些情况下它比其他更复杂的排序算法更有效。