当前位置: 首页 > article >正文

每天学习一个基础算法之插入排序

目录

前言:

一、插入排序的基本思路与实现方法

1、基本思路

2、实现方法

二、插入排序的执行过程示意图

三、插入排序的实现代码

插入排序代码主体(以接口函数的形式)

测试部分(主函数调用)

  四、对插入排序复杂度的分析

背景知识:

 1、插入排序的时间复杂度

2、插入排序的空间复杂度

总结:


前言:

本文从概念理解、思路分析、画图举例,代码实现、复杂度分析等多个方面对插入排序进行详细的讲解,包含插入排序的基本思路与实现方法执行过程示意图代码,以及对时间和空间复杂度的分析多个方面的知识。目录清晰,重点标红,部分加粗,方便各位初学者和复习者注意、搜索。

一、插入排序的基本思路与实现方法

1、基本思路

插入排序的基本思路:每次取出一个待排序的数据元素,按其大小插入到之前已经排行序的数据集中,直到全部待排序插入完毕。

2、实现方法

实现方法:从左边数第二个数(索引(或下标)为1的位置)开始取数,然后与其坐标所以的数进行比较,如果取的值比左边的值小就与其交换(重复交换以达到类似插入的效果),重复取数与比较直到排序完成为止。

二、插入排序的执行过程示意图

 橙色部分为上轮改变部分,箭头表示该轮要插入的数据与位置。

三、插入排序的实现代码

插入排序代码主体(以接口函数的形式)

//插入排序的实现
static void insert_sort(int arr[], int sz)
{
    int i = 0;
    for (i = 1; i < sz; i++)
    {
        int j = 0;
        //从外层循环下标值比较到第一个数
        for (j = i - 1; j > -1; j--)
        {
            if (arr[j + 1] < arr[j])//若找到较小值
            {
                //较小值左移
                int tmp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = tmp;
            }
            else
            {
                break;
            }
        }
    }
}

测试部分(主函数调用)

#include <stdio.h>
int main()
{
    int arr[] = { 10,7,4,9,6,1,8,3,2,5 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    insert_sort(arr, sz);
    int i = 0;
    //对排序完成的数组进行输出
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
 
}

  四、对插入排序复杂度的分析

背景知识:


时间复杂度:表示算法中基本操作(一般表示重复执行的操作)的执行次数,并不需要计算精确的执行次数,而只需要计算大概执行次数。 但我们计算时一般会尽可能先算其精确值,再通过大O的渐进表示法,取对变化趋势影响最大的部分。

空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,算的是额外创建变量的个数,也使用大O的渐进表示法。

 1、插入排序的时间复杂度

前置条件:设排序数据个数为N

最好情况:每个数都在恰好的位置(数据已排序好),即每个数只形式比较一次,不出现交换

只有N次,时间复杂度为O(N)

最坏情况:数组是逆序,精确计算:

1+2+3+……+(N-2)+(N-1)

=n(n-1)/2

时间复杂度为O(N^2)

2、插入排序的空间复杂度

所使用的空间不随数据大小变化,始终为一个常数,故空间复杂度为O(1)。

总结:

总结这三期博客,发现其实冒泡排序、选择排序、插入排序三种排序方式虽然思路与实现方式都不相同,但从复杂度方面来看其实是差不多相同的,可以说都已经将数据排序算法精炼到了极致,不必比较其优劣,但对我们来说理解多种方法是必要的,它不仅能拓宽我们的思路,也对我们的逻辑思维能力有很大的提升作用。

若想要对冒泡排序与选择排序进行了解可以看看我前两期博客。

每天学习一个基础算法之冒泡排序

http://t.csdnimg.cn/VQmZs

每天学习一个基础算法之选择排序

http://t.csdnimg.cn/t4SLh

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

若是对本文有什么独特的见解,也可以在评论区进行讨论。


http://www.kler.cn/a/288832.html

相关文章:

  • 从VLM到VLA概论
  • [OpenGL]使用 Compute Shader 实现矩阵点乘
  • [C/C++]new/delete 和 malloc/free 的区别?
  • Excel中一次查询返回多列
  • 【扩展卡尔曼滤波理论推导与实践】【理论】【1/3 前言】
  • H5 与 WebView 的双向通信实现详解
  • 谷歌地图广告指南
  • P1438 无聊的数列
  • React 实现PDF预览(数据源使用文件流而不是url)
  • 哪些好用的待办事项清单值得推荐:待办任务清单app
  • (二十八)STL set(集合)
  • 前端vue中怎么判断接口请求返回的时长
  • 【量化交易的数学基础】文科生也能搞懂的线性代数基础:矩阵和向量的那些事儿
  • 学习日志29
  • 【IT工具】Windows下XMind安装教程【不要米】及常用快捷键
  • 翻译_Clock Domain Crossing Design
  • 【RSA】简单说说什么是RSA非对称加密
  • C++封装:栈、队列
  • Vue.js 模板语法详解:插值表达式与指令使用指南
  • 企业微信hook协议接口,聚合群聊客户管理工具开发
  • 有关Prompt Engineering(提示词工程)的一些总结
  • pypiserver 搭建
  • webshell绕过样本初体验
  • SprinBoot+Vue问卷调查微信小程序的设计与实现
  • Pytorch安装 CUDA Driver、CUDA Runtime、CUDA Toolkit、nvcc、cuDNN解释与辨析
  • Qt QtConCurrent 使用示例