一)算法介绍
插入排序是一种比较简单的稳定排序算法。
基本操作:将一条记录插入到一个已排好的有序列表中,重新得到一个记录数量增1的有序列表。
稳定排序:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
二)算法原理
基本原理:通过构建一个有序序列,对未排序数据,从已排序序列中从后往前扫描,找到相应的位置并插入。
算法步骤图解(从first到last依次从小到大排列):
源数据:
第一遍排序:假设第一个元素已经排好序,选第二个元素44作为插入值,44>3,44和3位置不变。
第二遍排序:选第三个元素38作为插入值,38<44,把38插入到44前面,再比较38>3,38和3位置不变。
第三遍排序:选第四个元素5作为插入值,5<44,把5插入到44前面,再比较5<38,把5插入到38前面,比较5>3,5和3位置不变。
第四遍排序:选第五个元素47作为插入值,47>44>38>5>3,所以元素位置都不变。
第五遍排序:选第六个元素15作为插入值,15<47,把15插入到47前面,再比较15<44,把15插入到44前面,再比较15<38,把15插入到38前面,比较15>5>3,位置不变。
第六遍排序:选第七个元素36作为插入值,36<47,把36插入到47前面,再比较36<44,把36插入到44前面,再比较36<38,把36插入到38前面,比较36>15>5>3,位置不变。排序完成。
算法复杂度:
最差情况:T(n) = O(n^2)
最好情况:T(n) = O(n),在所有元素已经排好序的情况(只需要比较一次)
// n=100;
// O(n)含义
for(i=0;i<100;i++){
}
// O(n^2)含义
for(i=0;i<100;i++) {
for(i=0;i<100;i++){
}
}
三)算法源码
步骤简介:通过不断选择插入值,依次从右往左和数据中的元素比较,找到比插入值元素大的数,就把插入值插入到元素前面。
public static int[] insertionSort(int[] nums) {
if (nums == null) {
return null;
}
// 循环
for (int i = 0; i < nums.length - 1; i++) {
int index = i; // 记录元素下标i
int insertValue = nums[i+1]; // 取第2个元素作为插入值
while (index >= 0 && nums[index] > insertValue) {
nums[index+1] = nums[index]; // 把较大的值往后移动一位
index--; // 依次从右到左比较
}
nums[index+1] = insertValue; // 把较小的值插入到前面
}
return nums;
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!