什么是插入排序
插入排序的思想是假设前n个元素是有序的,那么就把第n+1个元素插入到前n个元素中的适当位置,直到第m个元素
假设我有个数组{3,1,4,2}
那么对于第一次遍历来说:
有序的就是 arr[0] 要插入的是arr[1]
经过比较后 第一轮的结果变为 {1,3,4,2}
对于第二次遍历:
现在有序的是{1,3} 要插入的是 arr[2]
经过比较后 变为 {1,3,4,2}
对于第三次遍历:
现在有序的是{1,3,4} 要插入的是 arr[3]
经过比较 变为 {1,2,3,4}
排序结束
插入排序的时间复杂度以及空间复杂度
插入排序的平均时间复杂度为O(n * n),空间复杂度为O(1),最好情况下时间复杂度为O(n),最坏情况下为O(n * n)
插入排序的使用
排序工具类
排序工具类的书写可以参考 我的另一篇文章
链接: 排序算法:冒泡排序
修改排序工具类
public static void insertSort(int[] arr)
{
int i = 0;
int orign;
int index;
int length = arr.length;
for(i = 1; i < length;i++)
{
orign = arr[i];
index = i-1;//1
while(index >= 0 && arr[index] > orign)
{
arr[index+1] = arr[index];
index--;
}
if(index < 0) arr[0] = orign;
else arr[index+1] = orign;
}
}
关于最好情况时间复杂度的分析
如果数组本身基本有序 下列代码片段基本不会进入
while(index >= 0 && arr[index] > orign)
{
arr[index+1] = arr[index];
index--;
}
所以时间复杂度就应该该是外层for循环,循环的次数,所以最好情况下时间复杂度为O(n)
工具类的使用
public class Test {
public static void main(String[] args) {
int[] arr = new int[] {8,3,2,1,7};
SortUtil.insertSort(arr);
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("[");
for (int i : arr) {
sBuilder.append(i);
sBuilder.append(",");
}
sBuilder.reverse();
sBuilder.deleteCharAt(0);
sBuilder.reverse();
sBuilder.append("]");
System.out.println(sBuilder);
}
}