Java 希尔排序(十大排序之一)

形成: 希尔排序与插入有关,插入排序在元素较少时效率比较高,但元素多的时候,比如有100个.如果最 后一个数最小,即a[100]最小,如果用插入排序,必须将前面99个元素分别向后移动一位,这时耗费资源较多.
这时可以利用希尔排序,将一个数组分为多个数组,将a[0],a[10],a[20],…a[100] 为一组,
a[1],a[11],a[11],… a[91] 为一组,
a[2],a[12],a[22],…a[92] 为一组,

a[9],a[19],a[29],…a[99] 为一组,
这时a[100]前面的元素只有10个,则只需10个元素分别向后移动一位就行,缩小了10倍.

public static void main(String[] args) {
		int[] a= {9,6,11,3,5,12,8,7,10,15,14,4,1,13,2};
		int gad=1;
		while(gad<=a.length/3) {
			gad=gad*3+1;
		}
		for(int gasd=gad;gasd>=1;gasd=(gasd-1)/3) {
		//直接从第5个开始比较大小
			for (int i=gasd; i < a.length; i++) {
			//为什么是i++.因为不是第一组比完才比较第二组,
			//而是先比较第一组的前两个,后比较第二组的前两个,...再比较第一组的前三个
			//比较第二组的前三个....
				for (int j = i; j >gasd-1; j=j-gasd) {//j层for循环的意义是比较前三个的数大小
					if(a[j]<a[j-gasd]) {
						int m=a[j];
						a[j]=a[j-gasd];
						a[j-gasd]=m;
					}
				}
			}
		}
		for (int i : a) {
			System.out.print(i+" ");
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值