【数据结构】排序算法---直接插入排序

ops/2024/11/13 9:13:27/

在这里插入图片描述

文章目录

  • 1. 定义
  • 2. 算法步骤
  • 3. 动图演示
  • 4. 性质
  • 5. 算法分析
  • 6. 代码实现
    • C语言
    • Python
    • Java
    • C++
    • Go
  • 7. 折半插入排序
    • 代码实现——C++
  • 结语

1. 定义

直接插入排序是一种简单直观的算法>排序算法。它的工作原理为将待排列元素划分为「已排序」和「未排序」两部分,每次从「未排序的」元素中选择一个插入到「已排序的」元素中的正确位置。

直接插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。

在这里插入图片描述

直接插入排序和冒泡排序一样,也有一种优化算法,叫做折半插入

2. 算法步骤

一般来说,直接插入排序都采用in-place在数组上实现。具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序;

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

  5. 将新元素插入到该位置后;

  6. 重复步骤2~5。

3. 动图演示

在这里插入图片描述

4. 性质

稳定性

直接插入排序是一种稳定的算法>排序算法

空间复杂度

直接插入排序的空间复杂度为 O ( 1 ) O(1) O(1)

时间复杂度

  • 元素集合越接近有序,直接插入算法>排序算法的时间效率越高。

  • 直接插入排序的最优时间复杂度为 O ( n ) O(n) O(n),在数列几乎有序时效率很高。

  • 直接插入排序的最坏时间复杂度和平均时间复杂度都为 O ( n 2 ) O(n^2) O(n2)

5. 算法分析

直接插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

6. 代码实现

C语言

void insertion_sort(int arr[], int len){int i,j,key;for (i=1;i<len;i++){key = arr[i];j=i-1;while((j>=0) && (arr[j]>key)) {arr[j+1] = arr[j];j--;}arr[j+1] = key;}
}

Python

def insertionSort(arr):for i in range(len(arr)):preIndex = i-1current = arr[i]while preIndex >= 0 and arr[preIndex] > current:arr[preIndex+1] = arr[preIndex]preIndex-=1arr[preIndex+1] = currentreturn arr

Java

public class InsertSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的for (int i = 1; i < arr.length; i++) {// 记录要插入的数据int tmp = arr[i];// 从已经排序的序列最右边的开始比较,找到比其小的数int j = i;while (j > 0 && tmp < arr[j - 1]) {arr[j] = arr[j - 1];j--;}// 存在比其小的数,插入if (j != i) {arr[j] = tmp;}}return arr;}
}

C++

void insertion_sort(int arr[],int len){for(int i=1;i<len;i++){int key=arr[i];int j=i-1;while((j>=0) && (key<arr[j])){arr[j+1]=arr[j];j--;}arr[j+1]=key;}
}

Go

func insertionSort(arr []int) []int {for i := range arr {preIndex := i - 1current := arr[i]for preIndex >= 0 && arr[preIndex] > current {arr[preIndex+1] = arr[preIndex]preIndex -= 1}arr[preIndex+1] = current}return arr
}

7. 折半插入排序

直接插入排序还可以通过二分算法优化性能,在排序元素数量较多时优化的效果比较明显。

时间复杂度:

折半插入排序与直接插入排序的基本思想是一致的,折半插入排序仅对插入排序时间复杂度中的常数进行了优化,所以优化后的时间复杂度仍然不变。

代码实现——C++

void insertion_sort(int arr[], int len) {if (len < 2) return;for (int i = 1; i != len; ++i) {int key = arr[i];auto index = upper_bound(arr, arr + i, key) - arr;// 使用 memmove 移动元素,比使用 for 循环速度更快,时间复杂度仍为 O(n)memmove(arr + index + 1, arr + index, (i - index) * sizeof(int));arr[index] = key;}
}

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

带你初步了解算法>排序算法:https://blog.csdn.net/2301_80191662/article/details/142211265
直接插入排序:https://blog.csdn.net/2301_80191662/article/details/142300973
希尔排序:https://blog.csdn.net/2301_80191662/article/details/142302553
十大经典算法>排序算法总结与分析:https://blog.csdn.net/2301_80191662/article/details/142211564

在这里插入图片描述


http://www.ppmy.cn/ops/111726.html

相关文章

先有正态分布,还是先有高斯函数?

概率分布是对自然界现象的一种数学描述。它提供了一种量化随机事件结果不确定性的方法&#xff0c;使我们能够更深入地理解和分析自然界中的各种随机现象。在自然界中&#xff0c;许多事件的结果是不确定的&#xff0c;如天气变化、生物种群的波动、物理粒子的运动等。这些事件…

Eclipse WEB项目在IDEA中使用

bolg前景 发现很多老邓教学喜欢用eclipse来作为javaweb课程的编译软件&#xff0c;但是我相信有很大一部分人都跟我一样喜欢用IDEA这款编译软件的&#xff0c;同时我发现很多文章都无法确确实实的解决“Eclipse WEB项目在IDEA中使用”这一问题&#xff0c;所以专门写了这篇文章…

mysql DBA常用的sql

是否一般查询日志&#xff0c;默认关闭 show variables like ‘general_log’; 是否开启慢日志查询 默认关闭 show global variables like ‘slow_query_log’; 开启慢日志查询 SET GLOBAL slow_query_log ‘ON’; 默认是10 单位s SELECT long_query_time; 设置超过1s就算…

机器学习与深度学习的区别

文章目录 机器学习与深度学习的区别一、引言二、机器学习概述1、机器学习定义1.1、机器学习的应用 2、机器学习算法 三、深度学习概述1、深度学习定义1.1、深度学习的应用 2、深度学习算法 四、机器学习与深度学习的区别1、学习方法2、数据需求3、应用领域 五、总结 机器学习与…

基于YOLO目标检测实现表情识别(结合计算机视觉与深度学习的创新应用)

基于YOLO&#xff08;You Only Look Once&#xff09;的目标检测技术实现的表情识别项目是一个结合了计算机视觉与深度学习的创新应用。该项目旨在通过分析人脸图像或视频流中的面部特征来识别七种基本人类情感表达&#xff1a;愤怒&#xff08;Angry&#xff09;、厌恶&#x…

使用 Nmap 进行 SSL/TLS 加密套件枚举

1. Nmap 简介 Nmap&#xff08;Network Mapper&#xff09;是一个开源的网络探测和安全审计工具。它广泛用于扫描网络并发现设备、端口及服务&#xff0c;同时也支持多种脚本来进行更高级的安全扫描。Nmap 的 -sV 参数可以用于探测开放端口上的服务及版本信息&#xff0c;配合…

人脸防伪检测系统源码分享

人脸防伪检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

如何使用myabtis log plugin插件展示出数据库查询语句

1、安装myabtis log plugin插件 直接插件市场搜该插件进行安装就行&#xff0c;安装完成后&#xff0c;会有如下图标 2、需要集成log4j springboot版本需要集成log4j&#xff0c;集成遇到的问题可以参考我之前文章 3、配置log4j.xml文件&#xff0c;添加mapper文件的打印 &l…