notice:
- 为了方便语言形容,本文章默认是从小到大排序。
- 原创,同步于我的个人博客:https://ca11m3g00d.top/
算法思路
插入排序算法把排序数组分为有序和无序两部分,一开始默认第一个元素为有序,之后每次一次插入操作都是把无序数组的第一个元素作为有序数组的一部分插入有序数组的对应位置,等无序数组的元素全部插入到有序数组之后,整个数组就是有序的。
算法伪代码
接受排序数组 arr[n]
令i从1循环到n-1,对于每次循环:
//数组分为有序部分arr[0]~arr[i-1]和无序部分arr[i]~arr[n-1]
把无序部分的第一个arr[i],插入到有序数组中的对应位置
令i=i+1,若可以则继续循环
java实现
class InsertionSorter {
public int[] arr; //要排序的数组
public void loadDefaultTestSample() { //加载默认的测试样例
arr = new int[]{1, 10, 2, 9, 3, 8, 4, 7, 5, 6, 1};
}
public void setArray(int[] input) { //根据已知数组来创建对象
arr = input.clone();
}
public boolean sortByInsertionSort() { //插入排序的主体
if (arr == null) {
return false;
}
for (int i = 1; i < arr.length; i++) {
int insertElem=arr[i]; //要插入的元素,即无序部分的第一个
int curIndex=i-1; //遍历有序数组用的索引
//反向遍历有序数组,只要当前元素大于要插入的元素,就让当前元素后移一位
while(curIndex>=0&&arr[curIndex]>insertElem){
arr[curIndex+1]=arr[curIndex];
curIndex--;
}
arr[curIndex+1]=insertElem; //将要插入的元素归位
}
return true;
}
public void printArray() { //输出当前的数组
System.out.println(Arrays.toString(arr));
}
}
算法特性
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
- 稳定性:稳定