几种常见的排序算法(插入排序,希尔排序,归并排序和快速排序)——希尔排序

希尔排序是对插入排序的改进版本,在对于大型的数组来说,插入排序的速度很慢,因为每次只能交换两个相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端,如果最小的元素刚好在数组的最后一位,就需要进行n-1次移动,在最坏的情况下时间复杂度为O(n²),希尔排序为了加快插入排序简单的改进了一下插入排序,交换不相邻的元素而对数组的局部进行排序,最终用插入排序将局部有序的数组排序。

static void exchange(int[] a,int i,int j) {
		int temp;
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
	public static void main(String []args){
		int[] a= {1,-1,0,5,4,3};
		int N=a.length;
		int h=1;
		while(h<N/3) h=3*h+1;
		while(h>=1) {
		for(int i=h;i<a.length-1;i++)
			for(int j=i;j>0&&a[j]<a[j-h];j-=h)
				exchange(a,j,j-h);
		h/=3;
		}
		for(int i=0;i<a.length-1;i++)
			System.out.println(a[i]+" ");
	}

前面一篇文章已经说到,插入排序对于倒置数量较少的数组或者说是部分有序的数组来说,效率很高,希尔排序减少了倒置,为插入排序的实现提供了便利。与插入排序相比,希尔排序的效率要高了很多,并且数组越大,优势越大。


猜你喜欢

转载自blog.csdn.net/KingYMxe/article/details/78042438