面试时这样介绍算法,想不高薪都难,排序算法(插入排序)

算法背景

插入排序是一种简单的排序算法,它的基本思想是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。

具体流程是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排好序的文件中适当位置上,直到全部插入完为止。插入排序的特点是:

  • 稳定性:插入排序是稳定的,即排序前两个相等关键字的记录的相对位置不变。

  • 直接插入排序是稳定的排序方法。

  • 时间复杂度:取决于输入数据的情况,最坏时间复杂度为O(n^2),最优时间复杂度为O(n),平均时间复杂度为O(n^2)。

  • 空间复杂度:O(1)

插入排序适用于小规模数据的排序,如果数据量较大,应该使用其他排序方法,如快速排序,堆排序等。

算法流程

插入排序算法的输入是一个无序的数组或列表,输出是一个有序的数组或列表。

算法流程如下:

  1. 从第二个元素开始遍历整个序列。

  1. 取出当前元素,并将其与前面已经排好序的序列元素从后往前逐一比较。

  1. 如果当前元素比比较的元素小,则将比较的元素移动到下一位。

  1. 重复上述比较和移动步骤,直到当前元素大于等于前面的元素,或者到达序列的第一个元素。

  1. 将当前元素插入到比较元素的后面。

  1. 继续遍历剩下的序列元素,重复上述比较和插入步骤,直到遍历完整个序列。

算法核心部分的具体实现可以用一个循环嵌套另一个循环实现,外层循环遍历整个序列,内层循环进行比较和移动元素的操作。

插入排序算法的时间复杂度为O(n^2),空间复杂度为O(1)。

时间和空间复杂度

时间复杂度:

  • 最好情况:当输入数组已经有序,那么插入排序的时间复杂度为O(n)

  • 最坏情况:当输入数组为逆序,那么插入排序的时间复杂度为O(n^2)

  • 平均情况:O(n^2)

空间复杂度:插入排序是一种原地排序算法,它只需要常数级的额外空间,因此空间复杂度为O(1)

请注意,上述时间和空间复杂度是理论上的值,在实际应用中,数据规模和硬件环境都会对算法的性能产生影响。

优缺点

优点:

  • 插入排序是一种稳定的排序算法,它会保持相同元素之间的相对顺序

  • 插入排序是一种原地排序算法,它不需要额外的空间

  • 插入排序对于部分有序的数组具有很高的效率

  • 插入排序简单易懂,容易实现

缺点:

  • 插入排序的时间复杂度为O(n^2),当数据规模较大时,效率较低

  • 当数组已经有序时,插入排序的时间复杂度依然为O(n^2),不如其他算法(如归并排序)在这种情况下快。

总的来说,插入排序是一种简单易懂,易于实现的排序算法,但在数据规模较大时,效率较低。插入排序适用于较小规模的数组和部分有序的数组。

示例代码

python

def insertion_sort(arr): # 遍历所有元素 for i in range(1, len(arr)): # 当前元素 key = arr[i] # 上一个元素 j = i-1 # 如果上一个元素大于当前元素,则将它移到当前位置 while j >=0 and key < arr[j] : arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr# 测试arr = [12, 11, 13, 5, 6]print("排序前:",arr)print("排序后:",insertion_sort(arr))

以上代码实现了一个插入排序函数,它将一个数组作为输入,并返回一个排序后的数组。代码中使用了两个循环,一个外层循环遍历所有元素,内层循环在每次遍历到当前元素时,将它插入到已经排序好的序列中正确的位置。最后,函数返回排序好的数组。

适用场景

插入排序算法适用于数据规模不大的场景。因为插入排序算法的时间复杂度随数据规模增大而增加,所以当数据量很大时不推荐使用该算法。

插入排序算法在实际应用中常用于排序小数组,或者在数据已经部分有序的情况下。它的优点是在已经有序的数组中插入元素时时间复杂度是线性的。在实际应用中,我们可以先使用其他算法对数据进行排序,然后使用插入排序算法维护数据的有序性。

另外,插入排序算法还可以用于实现其他算法,比如希尔排序,归并排序的归并过程等。

正面例子

当要对一个小数据集进行排序时,插入排序是一种非常高效的选择。它的时间复杂度为O(n^2),但在数据集较小时,它的性能优于冒泡排序和选择排序。

在对小规模数据进行排序时,插入排序算法是非常有效的。例如,当排序的数据集大小为n,其中n<=50时,使用插入排序算法可以得到非常优秀的性能。

反面例子

当要对一个大数据集进行排序时,插入排序的性能会变得非常糟糕。它的时间复杂度为O(n^2),因此在处理大数据集时会耗费大量时间。通常,在处理大数据集时应该使用其他更快的排序算法,如快速排序或归并排序。

在对大规模数据进行排序时,插入排序算法的性能非常糟糕。例如,当排序的数据集大小为n,其中n>1000000时,使用插入排序算法可能需要很长时间才能完成排序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码视野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值