JAVA_希尔排序

希尔排序是对插入排序的优化,优化思想:

插入排序在移动元素的时候是最浪费时间的,而如果有一种方法,让待排序的数组基本有序,然后再使用插入排序,性能就会提高一些。

此时,希尔排序就出现了。他的方法是逐步减小步长,例如,待排序的数组长度是10,那么步长依次取 10/2=5, 5/2=2, 2/2=1 (注:希尔排序的最后一次步长必须为1),下面发代码:

import java.util.Arrays;
/**
 * 插入排序的优化,减小步长
 * 希尔排序不稳定
 *
 */
public class ShellSort {
	//49, 38, 65, 97, 26, 13, 27,49, 55, 4

	public static void main(String[] args) {
		int arry[]={49,38,65,97,26,13,27,49,55,4};
		shellSort(arry,arry.length);
	}
	/**
	 * 
	 * @param arry	带排序数组
	 * @param len	数组长度
	 */
	private static void shellSort(int[] arry,int len){
		long time=System.currentTimeMillis();
		int i,j,gap;	//gap表示步长,第一趟排序gap=5,第二趟gap=2,第三趟gap=1;
		for(gap=len/2;gap>0;gap/=2){	//
			for(i=0;i<gap;i++){
				for(j=i+gap;j<len;j+=gap){
					int temp=arry[j];					
					int k=j-gap;
					while(k>=0&&temp<=arry[k]){	
						arry[k+gap]=arry[k];
						k-=gap;
					}
					arry[k+gap]=temp;	
				}
			}
		}
		System.out.println(Arrays.toString(arry));
	}

}


 

import java.util.Arrays;
/**
 * 上述希尔排序的优化,减少一层循环
 * 优化原理: 
 * 例:对数据 49, 38, 65, 97, 26, 13, 27,49, 55, 4 , gap=2 时
 * 是先对 49,65,26,27,55排序 ,再对 38,97,13,49,5 排序
 * 其实也可以把他们拆分来排序,即 先对49 65排序,然后对38,97排序,依次类推
 * 
 */
public class ShellSort02 {
	//49, 38, 65, 97, 26, 13, 27,49, 55, 4

	public static void main(String[] args) {
		int arry[]={49,38,65,97,26,13,27,49,55,4};
		shellSort(arry,arry.length);
	}
	private static void shellSort(int[] arry,int len){
		int j,gap;
		for(gap=len/2;gap>0;gap/=2){
			for(j=gap;j<len;j++){
				int temp=arry[j];
				int k=j-gap;
				while(k>=0&&temp<=arry[k]){
					arry[k+gap]=arry[k];
					k-=gap;
				}
				arry[k+gap]=temp;
			}
		}
		System.out.println(Arrays.toString(arry));
	}

}

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值