首页 > 其他分享 >插入排序

插入排序

时间:2025-01-12 10:11:21浏览次数:1  
标签:arr 插入排序 元素 数组 排序 复杂度

插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理类似于扑克牌的整理过程。在摸牌时,玩家会将每张新摸到的牌插入到手中已有的有序牌中的合适位置。

1. 算法步骤

  1. 初始状态:将数组分为已排序和未排序两部分。初始时,数组的第一个元素被认为是已排序部分,其余元素是未排序部分。
  2. 处理未排序元素
    • 从数组的第二个元素开始,依次取出未排序部分的元素。
    • 将取出的元素与已排序部分的元素从后往前进行比较。
    • 在比较过程中,若已排序元素大于取出的元素,就将该已排序元素向后移动一个位置。
    • 当遇到一个已排序元素小于或等于取出的元素,或者已比较到已排序部分的最前端时,将取出的元素插入到该位置之后。
  3. 重复过程:重复上述步骤,直到未排序部分没有元素,此时整个数组就已排好序。

2. 代码实现

以下是Python实现插入排序的代码:

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

3. 算法分析

  • 时间复杂度
    • 最坏情况:数组完全逆序,此时对于每一个未排序元素,都需要与已排序部分的所有元素进行比较并移动位置。第 i 个元素最多需要比较 i 次,总的比较次数为 \(1 + 2 + \cdots + (n - 1) = \frac{n(n - 1)}{2}\),时间复杂度为 \(O(n^2)\)。
    • 最好情况:数组已经有序,每个元素只需与已排序部分的最后一个元素比较一次,不需要移动位置,时间复杂度为 \(O(n)\)。
    • 平均情况:时间复杂度也是 \(O(n^2)\)。
  • 空间复杂度:插入排序只需要几个额外的变量来辅助排序,空间复杂度为 \(O(1)\)。
  • 稳定性:插入排序是稳定的排序算法。在比较和插入过程中,相等元素的相对顺序不会改变。例如,在数组 [2, 2*, 1] 中,两个 2 的相对顺序在排序后依然保持不变。

标签:arr,插入排序,元素,数组,排序,复杂度
From: https://www.cnblogs.com/codersgl-blog/p/18666703

相关文章

  • 直接插入排序讲解
    直接插入排序定义算法步骤复杂度分析代码示例(C)代码分析1.打印数组模块2.直接插入排序模块3.主函数模块图示过程初始状态第一轮排序(插入`11`)第二轮排序(插入`13`)第三轮排序(插入`5`)第四轮排序(插入`6`)运行流程图解最终结果优缺点定义直接插入排序是一种简单直......
  • C语言插入排序及其优化
    插入排序算法详解插入排序是一种简单直观的排序算法。它通过构建有序序列,将未排序部分的元素插入到已排序部分的正确位置,直到所有元素排序完成。下面是插入排序的关键点及其实现细节。算法思想从第二个元素(下标为1)开始,假定左侧的子数组已排序。将当前元素与已排序部分逐一......
  • 插入排序
    1if__name__=='__main__':2'''3插入排序41.从第一个元素开始,该元素可以认为已经被排序52.取出下一个元素,在已经排序的元素序列中从后向前扫描63.如果该元素(已排序)大于新元素,将该元素移到下一位置74.重复步骤3,直......
  • 插入排序知识点汇总:原理、特性与实践
    一、基本原理概念插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。可以类比为人们整理手中的扑克牌,每次拿到一张新牌,就将它插入到已经排好序的牌中的合适位置。算法步骤从第一个元素开始,该元素可以认为已经被排序。......
  • 学期总结——插入排序(从io,循环到类,时间复杂度,循环不变式)
    以插入算法的实现为例,从一开始写下思路,到证明循环不变式,从完全在主函数中书写,到把某些步骤写成函数,再到把这一算法写成类,而后分析时间复杂度目录算法的实现思路(循环不变式)做法完全在主函数中书写(实现一)将“交换”写成函数将“排序”写成函数将几乎所有步骤都写成函数(......
  • 数据结构与算法 - 排序 #直接插入排序 #希尔排序 #直接选择排序 #堆排序 #冒泡排序 #
    文章目录前言一、插入排序(一)、直接插入排序1、思路2、参考代码:3、复杂度计算:(二)、希尔排序1、思路2、参考代码:3、时间复杂度计算:二、选择排序(一)、直接选择排序1、思路2、参考代码3、时间复杂度计算(二)、堆排序三、交换排序(一)、冒泡排序(二)、快速......
  • 插入排序 计数排序 包括 代码 时间复杂度 空间复杂度 稳定性 是否能对代码进行提升
    插入排序代码:voidinsertsort(vector<int>&v){intn=v.size();for(inti=0;i<n;i++){intj=i-1;temp=v[i];for(;j>=0;j--){if(v[j]>temp){v[j+1]=v[j];}else{break;}}v[j+1]=......
  • 数据结构与算法Python版 插入排序与谢尔排序
    文章目录一、插入排序二、谢尔排序一、插入排序插入排序InsertionSort插入排序维持一个已排好序的子列表,其位置始终在列表的前部,然后逐步扩大这个子列表直到全表第1趟,子列表仅包含第1个数据项,将第2个数据项作为“新项”插入到子列表的合适位置中,这样已排序的......
  • 对希尔排序的理解——如何从插入排序进化到希尔排序?
    在学习希尔排序的过程中,发现很多博客只在讲希尔排序是什么,没有解释希尔排序是怎么设计的,为什么要使用增量。在开始前,我们要先强调一下,希尔排序的时间复杂度并不固定,它依赖于增量序列的选择。在最坏的情况下,希尔排序的时间复杂度为O(n^2),但是对于某些特定的增量序列,其时间复杂度可......
  • java 插入排序,原理、算法分析、实现细节、优缺点以及一些实际应用场景
    更多资源推荐:http://sj.ysok.net/jydoraemon提取码:JYAM实用优质资源/教程公众号【纪元A梦】 ###插入排序的详细解析探讨插入排序,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。####1.基本概念插入排序是一种简单的排序算法,其核心思想是将数组分为已排......