排序

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












你可能感兴趣的:(算法,工作)