六大常用排序算法--插入算法
插入算法
顾名思义,插入算法就是将元素插入到合适位置,以此来完成排序任务。
步骤
tip:按照升序排列
- 将待排序数组 arrays 中的第一位当作已经完成排序任务的序列,记作 sortArrays。 此时为了方便讲解,将原本的序列分为了两组,但实际上还是在同一个数组中。
- 此时待排序数组 arrays 中的第一位已经完成排序,取 arrays 中的下一个元素,与已经排序完成的序列 sortArrays 从后往前比较。
- 如果待比较的 sortArrays 的元素大于 arrays 取出的元素,则将该元素移动到下一位,同时 arrays 的待比较元素继续与 soutArrays 的前一个元素作比较。
- 重复该步骤。
图解
代码实现
如果此时还没有想明白那么我们不妨对比着程序来完成理解。
// C
//方法的命名采用驼峰命名,同时首字母小写,好的命名规范是写好程序的前提。
void sortArrays(int* arrays, int n)
//arrays是待排序数组,n为数组的长度。
{
for (int i = 0; i < n - 1; ++i) //由于有n个元素,我们只需要循环执行n-1次就可以将所有的元素完成排序。
{
//记录完成排序的有序序列最后一个元素的下标,每次比较从该下标开始比较。
int arraryEnd = i;
//获取待插入的元素
int tem = arrays[arraryEnd + 1];
//开始进行单趟排序,把有序数列的元素个数作为比较次数
while (arraryEnd >= 0)
{
//比较,如果有序数组的元素大就向后移东,不断进行覆盖。
if (tem < arr[arraryEnd])
{
//将已经排序完成的元素进行向后移动图解见图2;
arr[arraryEnd + 1] = arr[arraryEnd];
arraryEnd--;
}
//比插入的数小,跳出循环(一定要跳出循环)
else
{
break;
}
}
// 代码执行到此位置有两种情况:
// 1.待插入元素找到应插入位置(break跳出循环到此)
// 2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
// 不管那种情况,将该元素插入该下标处,完成排序。
arr[arraryEnd + 1] = tem;
}
}
图 2
将已经排序完成的元素进行向后移动的图解
由于最后一个元素已经赋值给变量 tem,所以再进行向后覆盖并不会造成数据丢失。
// Java
public void sortArrary(int[] arrarys){
//由于有n个元素,我们只需要循环执行n-1次就可以将所有的元素完成排序。
for(int i =0;i<arrarys.length-1;++i){
//记录完成排序的有序序列最后一个元素的下标,每次比较从该下标开始比较。
int end = i;
//获取待插入的元素
int tem = arrays[i+1];
//开始进行单趟排序,把有序数列的元素个数作为比较次数
while(end>0){
if (tem < arr[end])
{
//将已经排序完成的元素进行向后移动图解见图2;
arr[end + 1] = arr[end];
end--;
}
//找到比插入的数小,跳出循环(一定要跳出循环)
else
{
break;
}
}
arr[end + 1] = tem;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!