插入排序
将每一个数据插入到之前已经有序的数组中,在具体操作中需要将一部分元素向右移动一位。 对一个很大的且其中的元素已经有序的数组进行排序,插入排序会比随机顺序的数组快很多。
package sort;
public class Insertion {
public static void sort ( Comparable[ ] a) {
int N= a. length;
for ( int i= 1 ; i< N; i++ ) {
for ( int j= i; j> 0 && less ( a[ j] , a[ j- 1 ] ) ; j-- ) {
exch ( a, j, j- 1 ) ;
}
}
}
private static boolean less ( Comparable v, Comparable w) {
return v. compareTo ( w) < 0 ;
}
private static void exch ( Comparable[ ] a, int i, int j) {
Comparable t = a[ i] ;
a[ i] = a[ j] ;
a[ j] = t;
}
private static void show ( Comparable[ ] a) {
for ( int i = 0 ; i < a. length; i++ ) {
System. out. print ( a[ i] + " " ) ;
}
System. out. println ( ) ;
}
public static boolean isSorted ( Comparable[ ] a) {
for ( int i = 1 ; i < a. length; i++ ) {
if ( less ( a[ i] , a[ i - 1 ] ) )
return false ;
}
return true ;
}
public static void main ( String[ ] args) {
String[ ] a = In. readStrings ( ) ;
sort ( a) ;
show ( a) ;
}
}
结论
对随机排序的长度为N且主键不重复的数组,平均情况下插入排序需要~N2 /4 次比较以及~N2 /4次交换 《算法》这本书上说,对于长度为N的Double型随机数组,元素值均在0.0到1.0之间,插入排序比选择排序要快1.7 倍左右。