希尔排序

定义:

希尔排序输入插入排序,是一种分组插入排序。他比插入排序的优点在于可以减少时间复杂度,即减少数据移动次数

    即,给定一个数组,取一个小于数组长度的间隔n,从数组的小标0开始,在数组长度范围内,每隔n取一个数,放在一起,这样会形成一个分数组,然后对这几个分数组进行插入排序。

如:数组:98, 485, 58, 486, 482, 782, 1657 

先去增量为 3 

        98            486            1657   对其进行插入排序   98           486            1657

      485           482             对其进行插入排序         485         482

                   58             782       对其进行插入排序               58          782

                                            新的数组: 98 485 58 486 482 782 1657

.......

.......

.......

这样继续减小增量,直到增量为1;为1的时候即是对数组直接进行插入排序。

代码实现如下:

package xier;

import java.util.Arrays;

public class XiErDemo {
 
	public static void main(String arr[]){
		int []cc={34,5,46,7,8,86,24,69,0,256,79};
		xier(cc);
		System.out.println(Arrays.toString(cc));
	
	}
	private static void xier(int[] cc) {

		if(cc.length/2<=1){
			//表示数组的长度不大于2,则没必要分组,直接插入
			return ;
		}
		int length=cc.length;
		while(true){
			length=length/2;
			if(length<1){//如果分组的长度小于一,则表示排序已经结束
				break;
			}
			//对每一个分组间隔进行插入排序
			InsertSort(cc,length);
		}


	}	 
	/**
	 * @param arr 要排序的数组
	 * @param n 分组间隔*/
	public static void InsertSort(int []arr,int n){
		
		for(int x=0;x<n;x++){
			
			for(int i=x+n;i<arr.length;i=i+n){
				int temp=arr[i];
				int in=i-n;
				while(in>=0&&arr[in]>temp){
					arr[in+n]=arr[in];
					in=in-n;
				}
				in=in+n;
				arr[in]=temp;
			 }
			
		}
		  
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值