排序

来源:互联网 发布:pid4占用80端口 编辑:程序博客网 时间:2024/04/29 20:28

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 )。












原创粉丝点击