1.算法原理:
(插入排序算法是每次将一个新数据插入到有序队列中的合适位置的一种算法)
接下来我们来看伪代码:
2.具体思路:
(下面以升序为例)
1.首先假设第1到 j -1 之前的元素为有序的,现需将第 j 个元素插入到合适的位置;
2.因为单独一个元素一定是有序的,所以j从2到整个数组的长度开始外循环;
3.在插入第j个元素的时候,首先将第j个元素(值为key)与第j-1个元素进行比较;
4.若a[j]<a[j-1],则后面的元素是小于前者的,故需要将前一个位置的值替换为key;
5.依次进行移动,直到a[j]>=a[j-1],则为正确的位置也就结束内循环,开始插入下一个位置的元素.直到全部有序;
3.代码实现:
public static void insertSort(int[] arr) {
for(int i=2; i< arr.length; i++) {
int key = arr[i];
int j = i-1;
for( ; j>=0; j--) {
if(arr[j] > key) {
arr[j+1] = arr[j];
}
else
break;
}
if(key != arr[i]) {
arr[j+1] = key;
}
}
}
4.性能分析:
当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。
当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)。
所以,数据越接近正序,直接插入排序的算法性能越好。