Java 希尔排序

希尔排序

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

代码演示

public static void shellSort(int array[]) {
		if(array==null||array.length<=1) {
			return;
		}
		int n = array.length;
		int h =1;
		int temp ;
		//获取初始h(用来给元素分组的间距,距离为h数的分为一组,并比较大小通过交换位置排序)
		//希尔排序的性能不仅取决于h,还取决于h间的数学性质,如何选择h,就看自己理解了,这里用的h参考了算法书中的递增序列
		while(h>n/3) {
			h = 3*h+1;
		}
		//开始排序,先按照间距h进行局部排序,随着间距h的减小,最终达到全局排序。
		while(h>=1) {//当间距h小于1时,说明排序已完成
			
			//i从间距值h开始逐步递增,将间距为h的值进行比较排序
			for(int i =h;i<n;i++) {
				//比较间距为h的值之间的大小,由后往前比较,比如i=9,h=3,那就得比较下标为 9,6,3,0 的大小并逐个交换位置,直至下标9的值在正确位置
				//由于排序下标是由i=3开始递增的即下标9之前的的位置(0,3,6)都是排好序的
				//假设0,3,6,9 对应值为 A,C,D,B,他们大小关系为A<B<C<D,B应该在A和C之间,此时比较过程如下:
				//1. B与D比较 B<D,所以交换位置,此时顺序为 A,C,B,D
				//2. B与C比较 B<C,所以交换位置,此时顺序为 A,B,C,D 
				//3. B与A比较 B>A,不满足条件,跳出循环 i+1,变为10,然后接着循环比较 10,7,4,1下标的值,直至i=n,进入下一个h的比较
				for(int j = i;j>=h&&array[j]<array[j-h];j-=h) {
					//换位置,将小的值往前放
					temp = array[j];
					array[j] = 	array[j-h];
					array[j-h] = temp;
					
				}
				
			}
			//间距值按比例减小,直至间距为0,即没有需要比较的分组了
			h =h/3;
		}
		
		System.out.println(Arrays.toString(array));
		
	}
posted @ 2020-03-19 17:42  为了更美好的明天  阅读(172)  评论(0)    收藏  举报