根据寻找插入位置的方法对插入排序进行分类可以分为以下三类:
- 直接插入排序
- 折半插入排序
- 希尔插入排序
本篇主要介绍直接插入排序算法。
算法描述
插入排序的核心思想是每步将一个待排序的元素,按照其排序码的大小,插入到前面已经排好序的一组元素的合适位置上,直至元素全部插入完毕为止。如何为一个待排序元素在排好序的元素集合中寻找合适的插入位置是一个关键点,有三种合理的方法可以达到这个目的(这里将待插入元素记为A[i]):
- 从左到右扫描这个有序的子数组,直到遇到第一个大于等于A[i]的元素,然后就把A[i]元素插入到该元素的前面;
- 从右到左扫描这个有序的子数组,直到遇到第一个小于等于A[i]的元素,然后就把A[i]元素插入到该元素的后面。
1与2的实现思想被称为直接插入排序,3的实现方法成为折半插入排序。1与2的实现思想本质上是相同的,但是在实践中直接插入排序通常采用2中的思想。
算法分析
算法时间复杂度分析:
直接插入排序:
最好情况:O(n),输入数组按照升序排列好了
平均情况:O(n^2),比最坏情况快2倍
最坏情况:O(n^2),输入数组为严格递减数组
算法Java代码实现
直接插入排序算法代码:
import java.util.*;
public class InsertionSort {
public int[] insertionSort(int[] A, int n) {
// 输入数组边界判定
if(A==null||A.length==0){
return null;
}
for(int i=0;i<n-1;i++){
for(int j=i+1;j>0;j--){
//与前面元素依次比较,寻找合适的插入位置
if(A[j]<A[j-1]){
int temp = A[j];
A[j] = A[j-1];
A[j-1] = temp;
}
}
}
return A;
}
}