插入排序讲解

本文详细介绍了一种简单直观的排序算法——插入排序。通过一个具体的Java实现案例,展示了如何使用插入排序对整数数组进行排序。文章解释了算法的工作原理,包括最坏情况的时间复杂度为Θ(n²),并对比了其与归并排序在不同数据规模下的性能表现。

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

Θ2018-10-28 16:53:20 开始写

 


 

 


 

 1 package algorithms; //包名
 2 
 3 public class InsertionSort {//插入排序
 4 
 5     public static void main(String[] args) {//主方法
 6         int[] a = { 3, 1, 4, 6, 2 };//初始化数组
 7         System.out.println("原来的数字为:");//提示信息
 8         for (int i = 0; i < a.length; i++) {//循环遍历输出数组中的元素
 9             System.out.print(a[i] + " "); //输出数组元素,以空格分隔
10         }
11         System.out.println();//输出换行
12         for (int j = 1; j < a.length; j++) {//从数组的第二个开始,一直循环到数组最后
13             int key = a[j];//将当前需要排序的数组元素存放在key变量中,以便后续的插入操作
14             int i = j - 1;//获得当前需要插入元素的上一个元素的下标,用来于key比较
15             while (i > -1 && a[i] > key) {//判断i的值是否已经到达首元素,并且依次判断key下标之前的元素是否大于key,如果大于则依次向后移动一位,以便后续将key插入合适位置
16                 a[i + 1] = a[i];//将比key的元素依次向后移动一位
17                 i--;//将i减小一位,这样从后到前依次判断大小都向后移动直到首元素之前,这样就没有可以移动的元素。因为插入排序是这样的(数由 已经排好顺序的数列 和 需要插入到已经排序好的数中间的数 和 等待与已经排序好的数进行插入操作的序列
18             }
19             a[i + 1] = key;//将需要插入的key插入到不大于key的元素之后
20         }
21         System.out.println("排序后的数字为:");//提示信息
22         for (int i = 0; i < a.length; i++) {//循环遍历输出数组中的已排序号的元素
23             System.out.print(a[i] + " ");//输出数组元素,以空格分隔
24         }
25     }
26 }

说明:

首先注解很详细。

最坏情况:Θ(n2

在数量较少时插入排序速度比归并排序快,但超过某个临界值时归并排序远远超过插入排序

关于插入排序以后还会补充


 谢谢、Thank you、Salamat Do(撒拉玛特朵)、あリがCám o*n(嘉蒙)とゥ(阿里嘎都)、감사합니다 (勘三哈咪瘩)、terima Kasih(得力马卡系)、kob-khun(寇布库恩)、dhanyavaad(达尼阿瓦德)、toda(透达)、te?ekkür ederim(特谢库尔埃戴里姆)、Dzie,kuje(以库以而)、Spasibo(思巴喜柏)、Danke(但可)、shokran(休克朗)、Obrigada(欧布哩嘎搭)、dank u(当Q)、Merci(梅呵西)、Gracias(格拉喜亚思)、Grazie(格啦姬)、Благодарности、Tak、Kiitos、Díky、Hvala、Mul?umesc、Takk、Ευχαριστ


 

转载于:https://www.cnblogs.com/YUJIE666/p/9866193.html

### C++ 中插入排序的实现原理 #### 一、插入排序的基本概念 插入排序是一种简单直观的排序方法,其核心思想是通过构建有序序列逐步扩展的方式完成排序。具体来说,在每一轮迭代中,将当前未排序区域的第一个元素取出,并将其插入到已经排好序的部分中的适当位置[^3]。 #### 二、算法的工作机制 在插入排序的过程中,数组被分为两部分:左侧为已排序好的子数组,右侧为尚未处理的剩余部分。初始状态下,假设第一个元素已经是有序的。随后逐一遍历其余元素,对于每一个新元素,其前边所有的已排序元素逐一比较并调整顺序直到找到合适的插入点[^4]。 以下是具体的执行过程描述: 1. 假设第 `i` 轮开始时,前面 `[0,i-1]` 的元素已经被排列成升序; 2. 将第 `i` 个元素保存在一个变量(如 `temp`)中作为目标值; 3. 对于索引从 `i-1` 到 `0` 的范围内的所有元素进行逆向扫描,如果发现某个元素大于 `temp`,则将其右移一位; 4. 当遇到小于等于 `temp` 或者到达边界的情况停止移动,此时可以安全地把 `temp` 放置在这个空位上。 这种策略使得每次新增加进来的一个数值都能正确嵌入现有秩序之中形成新的更长一段连续递增片段[^5]。 #### 三、C++代码实例分析 下面给出基于上述逻辑编写的完整程序清单: ```cpp #include <iostream> using namespace std; int main(){ int a[] = {2,6,5,3,4,1}; int n = sizeof(a)/sizeof(*a); // 开始遍历除首项外的所有项目 for(int i=1;i<n;i++){ int key = a[i]; int j=i; /* 向左寻找适合放置key的位置 */ while(j>0 && a[j-1]>key){ a[j]=a[j-1]; // 右移较大的元素 --j; // 继续向前查找 } a[j]=key; // 插入至最终定位处 } // 输出结果验证效果 for(auto elem : a) cout<<elem<<" "; return 0; } ``` 此版本实现了标准形式下的直接插入排序功能[^1]。其中值得注意的是内部循环控制条件以及如何高效利用局部变量来减少不必要的内存访问次数从而提升性能表现。 #### 四、时间复杂度评估 关于效率方面考虑最坏情况即完全倒序输入情形下需做 O(n²) 次基本运算;而最佳情况下当原始资料本身几乎接近正序分布时仅需线性级别O(n),因此总体平均下来属于平方级增长趋势的时间消耗模式[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值