希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
是插入排序的一种,只不过是效率更高。就能独立成一种算法。
对希尔算法,就是先知道这个数组的长度n,,
所以,它的一半就是n/2,如果不能整除就向上取整;
第一轮:先将数据分成两组,个数是奇数的话,向上取整。
取出来第一组的第一个数,和第二组的第一个数比较
取出来第一组的第二个数,和第二组的第二个数比较 
….对应的位置比较 
第一轮结束。
第二轮,根据第一轮的一半(可能向上取整了)的一半分组(第二轮不会有向上取整,肯定是偶数,1除外….);
又是第一轮的方法,取出来新的第一组的第一个数,先与第二组的第一个数比较,第一个数字大了就和第二组的第一个数互换位置。
比完了后,又将第二组的第一个数和第三组的第一个数比较。
以此类推….比到最后一个没得比了,
拿就从第一组中取出来第二个数,按照上面的方法开始往下比较…  
…… 
…… 
直到>>>一半的一半的一半…等于1,就按照顺序,第一个,第二个比较看是否要换位置后,又将第二个与第三个进行比较… 
比较完了就排好序了…


代码:

/**
 * 希尔排序(最小增量排序)
 * 基本思想:
 * 算法先将要排序的一组数按某个增量 d(n/2,n为要排序数的个数)分成若干组,
 * 每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,
 * 然后再用一个较小的增量(d/2)对它进行分组,
 * 在每组中再进行直接插入排序。
 * 当增量减到 1时,进行直接插入排序后,排序完成。
 */
public class Client {
	public static void main(String[] args) {
		int[] a = {49, 38, 65, 97, 76, 13, 27, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
		System.out.println(Arrays.toString(a));
		System.out.println("=======================");
		shellSort(a);
	}

	/**
	 * 用希尔算法进行排序
	 *
	 * @param a 需要排序的数组
	 */
	private static void shellSort(int[] a) {
		double d1 = a.length;
		int temp = 0;

		//开始循环
		while (true) {
			//ceil 则是不小于他的最小整数
			//每循环一次,增量就减半向上取整
			d1 = Math.ceil(d1 / 2);
			int d = (int) d1;
			//开始进行遍历数组分割出来的第一部分
			for (int x = 0; x < d; x++) {
				//
				System.out.println("-------" + d + "--------");
				for (int i = (x + d); i < a.length; i += d) {
					int j = (i - d);
					temp = a[i];
					System.out.println("i==" + i);
					System.out.println("temp==" + temp);
					System.out.println("j==" + j);
					System.out.println("a[j]==" + a[j]);
					for (; j >= 0 && temp < a[j]; j -= d) {
						a[j + d] = a[j];

					}
					a[j + d] = temp;
				}
				System.out.println(Arrays.toString(a));
			}
			//当d==1的时候跳出死循环
			if (d == 1) {
				break;
			}
		}
//		System.out.println(Arrays.toString(a));
	}
}

转自:http://blog.csdn.net/www_wangjun/article/details/73291502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值