算法学习——希尔排序

希尔排序的思想就是将排序对象分为步长序列进行插入排序,步长序列的增量是递减的,那么什么是步长序列呢?简单的说就是将一个大的序列按照固定的增量分为若干个小的序列,当数字作为序列的下标时,1,3,5,7,9就是一个步长序列,仔细考虑考虑不难理解,若一个长度为10的序列,将其按照增量为5来分段,此时要进行插入排序的分别是下标为0和5,1和6,2和7,3和8,4和9的元素,话不多说,咱们直接来看代码:

package pp.suanfa;

/**
 * 希尔排序
 * @author xiaoGd
 *
 */

public class TestShell {
	
	public static void shellSort(int array[])
	{
		int length = array.length;
		int i,j;
		int h;
		int temp;
		for(h=length/2;h>0;h=h/2)//第一层for循环用来确定步长序列的增量
		{
			for(i=h;i<length;i++)//第二层for循环用来确定每段步长序列进行插入排序的基准数
			{
				temp = array[i];//1.temp = array[i];
				for(j=i-h;j>=0;j-=h)//第三层for循环用来将每段步长序列中其它的数同基准数进行比较
				{
					if(temp<array[j])
					{
						array[j+h] = array[j];//2.array[i] = array[j];
					}
					else
						break;
				}
				array[j+h] = temp;//3.array[j] = temp; 因为执行完j-=h;后,j+h就等于for循环中的j
				//通过上面的1、2、3步完成位置的互换
			}
		}
	}
	public static void main(String[] args) {
		int i = 0;
		int[] a = {5,4,9,8,7,6,0,1,3,2};
		int len = a.length;
		shellSort(a);
		for(i=0;i<len;i++)
		{
			System.out.print(a[i]+" ");
		}
	}
}

运行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值