插入排序,含python代码和视频演示

插入排序详解
本文详细介绍了插入排序算法的工作原理,通过逐步解析,展示了如何通过比较和移动元素来对数组进行排序。文章提供了Python实现代码,并分析了算法的时间和空间复杂度。

转载自:https://procjx.github.io/2020/03/06/%E3%80%90%E7%AE%97%E6%B3%95%E3%80%91%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F-Insert-Sort/

算法介绍

插入排序,依次取数组元素,与已排序的数据进行逐一比较,找到该元素的合适位置,放下该元素,直到完成排序。

视频演示

视频地址:https://www.bilibili.com/video/av18980488

python代码

#-*- coding: utf-8 -*-

# 升序
def insert_sort(data):
    n = len(data)
    # 外循环,依次拿出第 i 个数
    for i in range(1, n):
        cur_data = data[i]
        j=i-1
        # 内循环, 在已排序的数据中,找出当前数应该放的位置
        while j>=0 and cur_data<data[j]:
            data[j+1]=data[j] # 将大的数依次往后挪一位,为当前数腾位置
            j-=1
        data[j+1]=cur_data
    return data

if __name__ == '__main__':
    data = [7, 8, 5, 2, 4, 6, 3]
    sorted_data = insert_sort(data.copy())
    print("排序前:", data)
    print("排序后:", sorted_data)

算法分析

最好情况下,数据刚好是升序,比较次数为 n-1 , 挪动次数为 0;
最坏情况下,数据刚好是降序,比较次数为 n*(n-1)/2, 挪动次数为 n*(n-1)/2.

插入排序时间复杂度为:O(n^2)

插入排序空间复杂度:O(1)

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模与仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建与控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态与位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制与轨迹跟踪。此外,文章还提到了多种优化与控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学与科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究与对比分析; 阅读建议:建议读者结合文中提到的Matlab代码与仿真模型,动手实践飞行器建模与控制流程,重点关注动力学方程的实现与控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
### 折半插入排序简介 折半插入排序是一种改进的插入排序方法。该算法通过二分查找来减少比较次数,从而提高效率。对于长度为 n 的数组,在最坏情况下时间复杂度仍为 O(n²),但在实际应用中性能通常优于简单插入排序[^2]。 #### 折半插入排序工作原理 在传统插入排序基础上进行了优化: - 对于待插入元素 key ,不再线性扫描左侧已排序序列寻找合适位置; - 使用二分查找定位key应放置的位置index; - 将 index 及其右侧所有元素右移一位腾出空间给key; 此过程重复直到整个列表有序为止。 #### Python 实现示例 以下是基于上述描述编写的Python版本折半插入排序函数: ```python def binary_search(arr, val, start, end): # We need to distinugish whether we should insert before or after the left bound. if start == end: if arr[start] > val: return start else: return start + 1 if start > end: # error condition return start mid = (start + end) // 2 if arr[mid] < val: return binary_search(arr, val, mid + 1, end) elif arr[mid] > val: return binary_search(arr, val, start, mid - 1) else: return mid def insertion_sort(array_): for i in range(1, len(array_)): value_to_insert = array_[i] pos = binary_search(array_, value_to_insert, 0, i - 1) array_ = array_[:pos] + [value_to_insert] + array_[pos:i] + array_[i+1:] return array_ print(insertion_sort([37, 23, 0, 17, 12, 72, 31])) ``` 虽然以上代码实现了功能,但是为了更直观理解这个概念,建议观看一些在线资源提供的动画演示视频教程。遗憾的是当前提供的参考资料并未提及具体的折半插入排序教学材料链接[^1]^[]^。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值