【唐老狮】排序——插入排序

本文详细介绍了插入排序的基本原理和关键逻辑,通过两层循环实现排序过程,其中第一层循环从1开始遍历,第二层循环找到合适的插入位置。文章还讨论了如何使用while循环优化比较,并解释了如何根据条件实现升序或降序排列。最后,提供了练习题目供读者实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【插入排序】


【基本原理】

两个区域

排序区

未排序区

用一个索引值来区分

未排序区元素

与排序区元素比较

插入到合适位置

直到未排序区清空

图片

 

排序开始前,首先认为第一个元素在排序区其它所有元素在未排序区

排序开始后,每次将未排序区第一个元素取出用于和排序区中元素比较。如果满足条件(较大或者较小),则排序区中元素往后移动一个位置

注意

所有数字都在一个数组中

所谓的两个区域是一个分水岭索引


【关键逻辑】

循环n-1次

有n个数就循环n-1次

 


每一轮

取出未排序区的第一个元素

得到排序区最后一个元素的索引位置

 

第一轮

未排序的第一个元素

noSortNum = 7

排序区的最后一个元素索引

sortIndex = 0

 

第二轮

noSortNum = 9

sortIndex = 1

以此类推


确定插入位置

 

用未排序区第一个元素

从已排序区最后一个元素开始

依次往前比较

如果满足条件

已排序区元素往后移动一个位置


插入数字

 


【标准实现】

 

排序结果

 

【逻辑分析】

-为什么有两层循环-

第一层循环

依次取出未排序区的元素进行排序

第二层循环

找到想要插入的位置

-为什么第一层循环从1开始遍历-

 

插入排序的关键是分两个区域

已排序区

未排序区

默认第一个元素在已排序区

每一轮循环的目的是

依次取出未排序区的元素进行排序

-为何用while循环-
 

之前学习的冒泡排序和选择排序,之所以第二层循环是for循环,是因为它们每一轮都需要数组中剩下的所有元素进行比较不存在中途停止循环的情况。而插入排序在比较过程中,只要条件不满足就马上要停止比较,所以while循环更适用!(当然用for循环也是可以实现的)

满足条件才比较

否则证明插入位置已确定

不需要继续循环

-为什么可以直接往后移位置   为什么后移结束要减减-

 

每轮未排序数已记录

最后一个位置不怕丢

 

减减比较下一数

以此类推找位置

 

-为什么确定位置后  是放在sortIndex + 1的位置-

 

 

接着会进行比较

 

这时sortIndex = 0,而3小于4所以不会再进循环了,因此循环结束,证明4应该放在1的位置,也就是sortIndex + 1的位置。所以这里的逻辑总结一下就是:当循环停止时,插入位置应该是停止循环的索引加1处!

-如何降序排列-

 

升序(从小到大)

降序(从大到小)

具体是哪种排序

关键点就是条件表达式

如果是大于(>)

已排序数大于未排序数

则进入循环继续往前找

也就是要把小的数往前放

结果就是升序排序

如果是小于(<)

已排序数小于未排序数

则进入循环继续往前找

也就是要把大的数往前放

结果就是降序排序

 


【练习】

之前的冒泡排序和选择排序,我们都知道他们是没有固定写法的,可以从前往后遍历,也可以从后往前遍历。而插入排序也是没有固定写法的,目前我们实现的是默认第一个为已排序区元素,如果你对插入排序已经了解了,可以自己尝试实现默认最后一个元素为已排序区元素,来实现插入排序


 

【总结】
 

-基本原理-

两个区域

用索引值来区分

未排序区与排序区

元素不停比较

找到合适位置

插入当前元素

-套路写法-

两层循环

一层获取未排序区元素

一层找到合适插入位置

第一个未排序元素值

最后一个已排序元素索引

用未排序元素值

依次遍历比较已排序元素

找到合适位置

第二层循环外插入

-注意事项-

默认开头已排序

默认结尾已排序

第二层循环外插入


关注唐老狮获取更多干货内容

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值