排序算法——直接插入排序

直接插入排序与希尔排序是插入排序的两个分支,直接插入排序是较为简单的一种排序算法,同时也是众多算法实现或优化的基石。

前提:

插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序, 这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,是稳定的排序方法。

简单来说,就是打斗地主时,你已经摸了几张牌并将牌从小到大排列成有序的概况,这时再摸一张牌,将其也插入到合适的位置,使所有牌继续有序。

算法思想分析:

直接插入排序自然秉承了这一思想,直接插入排序算法的思想是:当插入第i个元素时,arr[0]到arr[i-1]个元素已经排好序,这时用array[i]按与array[i-1],array[i-2],...的顺序依次进行比较,如果找到合适的位置就将arr[i]插入,没找到就继续比较,原来位置的元素顺序后移。

有图有真相:


举个例子:

arr[i]=27,在arr[i]前面的数字已经有序,这时就将arr[i]与arr[i-1]ye也就是27与47比较。

27小,47向后移。

arr[i]再与arr[i-2]也就是44比

,27小,44向后移.......

与arr[i-4](即36)比较,36小,36向后移。

直到遇到arr[i-5]也就是26,27比26大。27插入到原arr[i-4]的位置,单趟排序结束。

代码如下:

这里我们定义一个变量end,假设从a[0]到a[end]范围有序,定义tmp保存下标为第end+1的数。

while循环,如果tmp比它前一个数小,前一个数后移,tmp继续比较。直到遇到比tmp小的或者tmp最小(end=-1,tmp应落到arr[0]位置),循环结束。将tmp赋给end+1的位置,保持有序。

上面这段代码目的是将第i个数插入到合适的位置,也就是说这是一个单趟排序。;了解了单趟排序,将一堆杂乱的数排序成有序序列(多趟排序)就很简单了:

我们在while循环外再套一层for循环,当i=0时,只有一个数据,是有序的。

i=1时,两个数据:进行比较.......

最后当end=n-2时(倒数第二个元素),与最后一个数比较,整个数组有序。

检验:

最后的打印函数一并在这。

时间复杂度:O(n^2)

最坏情况全部杂乱,需要单趟排序一次一次重复比较,铁铁的O(n^2);

最好情况就是全部有序,此时只需遍历一次,这时时间复杂度为O(n);

空间复杂度:O(1)

它是一种稳定的排序算法

相关推荐
重生之我是Java开发战士8 分钟前
【广度优先搜索】多源BFS:矩阵,飞地的数量,地图中的最高点,地图分析
数据结构·算法·矩阵·广度优先
sali-tec15 分钟前
C# 基于OpenCv的视觉工作流-章43-轮廓匹配
图像处理·人工智能·opencv·算法·计算机视觉
Coovally AI模型快速验证25 分钟前
检测+跟踪一体化!4.39M参数、8.3W功耗,轻量化模型让无人机在露天矿实时巡检
算法·yolo·无人机·智能巡检·智慧矿山
玛卡巴卡ldf28 分钟前
【LeetCode 手撕算法】(矩阵)73-矩阵置零、54-螺旋矩阵(贪吃蛇)、48-旋转图像
java·数据结构·算法·leetcode·力扣
C^h28 分钟前
RTthread中的内存池理解
linux·数据库·c++·算法·嵌入式
深藏功yu名28 分钟前
Day25(高阶篇):RAG检索与重排序算法精研|从原理到参数调优,彻底攻克检索瓶颈
人工智能·算法·ai·自然语言处理·排序算法·agent
郝学胜-神的一滴33 分钟前
深入解析:生成器在UserList中的应用与Python可迭代对象实现原理
开发语言·python·程序人生·算法
雪木木33 分钟前
刷题:力扣热题100--滑动窗口(Day03)
算法·leetcode
lcj251135 分钟前
蓝桥杯C++:数据结构(功能导向速查)
数据结构·c++·蓝桥杯
Yzzz-F36 分钟前
Problem - 2157D - Codeforces
算法