1、插入排序
public static <T extends Comparable<? super T>>
void insertionSort( T[] a ){
int j;
for( int p=1; p<a.length; p++ ){
T tmp = a[p];
for( j=p; j>0 && tmp.compareTo( a[j-1] )<0; j-- ){
a[j] = a[j-1];
}
a[j] = tmp;
}
}
由于嵌套循环的每一个都花费 N 次迭代,因而插入排序为 O( N² )
插入排序的平均情形也是 Θ( N² )
2、希尔排序
它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
由于这个原因,希尔排序有时也叫做缩减增量排序。
希尔排序使用一个序列 h1, h2, h3, ... hi, 叫做增量序列。只要 h1 = 1,任何增量序列都是可行的。在使用增量 hk 的一趟排序之后,对每一个 i 都有 a[ i ] <= a[ i + hk ] 所有相隔 hk 的元素都被排序。此时称文件是 hk 排序的。
public static <T extends Comparable<? super T>>
void shellsort( T[] a ){
int j;
for( int gap = a.length/2; gap>0; gap/=2 ){
for( int i=gap; i<a.length; i++ ){
T tmp = a[i];
for( j=i; j>=gap && tmp.compareTo( a[j-gap] )<0; j-=gap ){
a[j] = a[j-gap];
}
a[j] = tmp;
}
}
}
3、堆排序
建立 N 个元素的二叉堆,这个阶段花费 O( N ) 时间。
然后执行 N 次 deleteMin 操作。按照顺序,最小的元素先离开。通过将这些元素记录到第二个数组,然后再将数组拷贝回来,得到 N 个元素的排序。由于每个 deleteMin 花费时间 O( log N ),因此总的运行时间是 O( N log N )。