public class InsertSort {
public void sort ( int [ ] A) {
int i, j;
for ( i = 2 ; i < A. length; i++ ) {
if ( A[ i] < A[ i - 1 ] ) {
A[ 0 ] = A[ i] ;
for ( j = i - 1 ; A[ 0 ] < A[ j] ; j-- ) {
A[ j + 1 ] = A[ j] ;
}
A[ j + 1 ] = A[ 0 ] ;
}
}
}
public void sort2 ( int [ ] A) {
int i, j;
for ( i = 2 ; i < A. length; i++ ) {
if ( A[ i] < A[ i - 1 ] ) {
int temp = A[ i] ;
for ( j = i - 1 ; temp < A[ j] && j >= 1 ; j-- ) {
A[ j + 1 ] = A[ j] ;
}
A[ j + 1 ] = temp;
}
}
}
public static void main ( String args[ ] ) {
int [ ] A = new int [ ] { 0 , 2 , 3 , 5 , 1 , 4 , 9 , 7 , 8 , 6 } ;
InsertSort insertSort = new InsertSort ( ) ;
insertSort. sort2 ( A) ;
for ( int i = 0 ; i < A. length; i++ ) {
System. out. print ( A[ i] ) ;
}
}
}
直接插入排序适用于:顺序存储、链式存储的线性表
当为链式存储时, 可以从前往后查找指定元素的位置再插入,没有元素的移动。
空间复杂度O ( 1 )
时间复杂度:比较+ 移动
最好:有序时:比较n次 + 移动0 = O ( n)
平均:取最好最坏的平均值 = ( n+ n^ 2 ) / 2 = O ( n^ 2 )
最坏:逆序时:比较2 + 3 + 4. . . +n次 + 移动1 + 2 + 3 + . . . n = O ( n^ 2 )
稳定性:稳定