【排序】希尔排序模板

希尔排序又称缩小增量排序

1、先取定一个小于n的整数gap1作为第一个增量。把整个序列分成gap1组。全部距离为gap1的倍数的元素放在同一组中,在各组内分别进行排序(分组内採用直接插入排序或其他基本方式的排序)。(一般gap1为n/2。一次往后类推:gap2=gap/2,若为奇数,则gap2=(gap1+1)/2  gap1=(n+1)/2)

2、然后取第二个增量gap2<gap1,反复上述的分组和排序。

3、依此类推,直至增量gap=1。即全部元素放在同一组中进行排序为止。

public class SortMethods {
	
	/*输出数组中的元素*/
	private static void print(int[] a) {
		for(int num: a){
			System.out.print(num+"\t");
		}
		System.out.println();
	}
	private static void swap(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[] = {0,21,25,49,25,16,15,8,-2,0,-9,67,34,5,12,40};
		shellSort(a);
		print(a);
	}
	//希尔排序
	private static void shellSort(int[] a) {
		//进行分组。初始步长设为数组长度的一半即n/2。然后依次减半,直到最后取1
		for(int gap=(a.length+1)/2;gap>0;){
			//组内排序
			for(int i=0;i<a.length-gap;i++){//定位到每个元素
				for(int j=i;j<a.length-gap;j+=gap){
					if(a[j]>a[j+gap]){
						swap(a,j,j+gap);
					}
				}
			}
			//for循环的修正(这里就是让奇数的加一后在二分,还有gap=1时。就是循环结束的时候。切要放在else里面否则最后gap=1不会进行排序的)
			if(gap>1){
				gap = (gap+1)/2;
			}else if(gap==1){
				break;
			}
		}
		
		
	}
	
}










转载于:https://www.cnblogs.com/jzdwajue/p/6756097.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值