插入排序算法原理

插入排序

1.概念

插入排序,顾名思义其基本操作就是插入,不断把一个个元素插入到一个序列中,最终得到排序序列。为此只需维护好所构造序列的排序性质,最终就能自然得到结果。

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

2.详细分析

插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表。

比如,待排序列表为[49,38,65,97,76,13,27,49],则比较的步骤和得到的新列表如下:

(带有背景颜色的列表段是已经排序好的,红色背景标记的是执行插入并且进行过交换的元素)
在这里插入图片描述

3.步骤

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果被扫描的元素(已排序)大于新元素,将该元素后移一位
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

排序演示:
在这里插入图片描述

4. python代码

def insert_sort(s):
    for i in range(1,len(s)): #开始时片段[0:1]已排序
        x=s[i]
        j=i
        while j>0 and s[j-1]>x:
            s[j]=s[j-1] #反序逐个后移元素,确定插入位置
            j-=1
        s[j]=x
    return s
s=[2,8,9,1,3]
insert_sort(s)

输出结果:[1,2,3,8,9]

5.算法分析

最佳情况:T(n) = O(n) 最坏情况:T(n) = O(n2) 平均情况:T(n) = O(n2) 稳定

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
插入排序是一种简单直观的排序算法,其原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。具体的Java实现如下所示: ```java import java.util.Arrays; public class InsertSort { public static void main(String\[\] args) { int arr\[\] = {2,1,5,3,6,4,9,8,7}; int temp; for (int i=1;i<arr.length;i++){ // 待排元素小于有序序列的最后一个元素时,向前插入 if (arr\[i\]<arr\[i-1\]){ temp = arr\[i\]; for (int j=i;j>=0;j--){ if (j>0 && arr\[j-1\]>temp) { arr\[j\]=arr\[j-1\]; }else { arr\[j\]=temp; break; } } } } System.out.println("排序后:"+ Arrays.toString(arr)); } } ``` 这段代码中,我们使用了两层循环。外层循环从第二个元素开始遍历到最后一个元素,内层循环则是从当前元素向前遍历,找到合适的位置插入。如果待排元素小于有序序列的最后一个元素,就将有序序列中的元素向后移动,直到找到合适的位置插入。 插入排序的平均时间复杂度为O(n^2),空间复杂度为O(1),是一种稳定排序算法。对于已经有序或者基本有序的数据来说,插入排序的效率要好得多。当数据有序时,算法运行只需要O(N)的时间。如果数据基本有序,插入排序几乎只需要O(N)的时间,是一个简单而有效的排序方法。\[2\]\[3\] #### 引用[.reference_title] - *1* [Java插入排序原理](https://blog.csdn.net/JohnGene/article/details/122411721)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [java实现插入排序以及原理解释](https://blog.csdn.net/qq_44922113/article/details/103996870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [插入排序算法原理及java代码实现](https://blog.csdn.net/qq_21993785/article/details/80373936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值