java排序之希尔法
在掌握了插入法排序之后,我们来看看希尔排序法,希尔排序法是插入法的升级版,整体逻辑与插入法一样.我认为,希尔法就是若干个不同元素组成的不同组分别使用插入法组合到一起的一种逻辑方法。主要通过分组来实现,下面一个例子说明:
对{7,5,4,6,3}进行升序排序
首先进行分组,求得分组数d=数组长度/2,则{7
, 5, 4
, 6,3
}红色元素为一组,黑色元素为另一组,下面就是对这两组分别使用插入法排序了
-
同样的元素7为排序组,剩余红色元素为未排序组,把下标为d的元素(4)赋给一个临时变量值min,定义一个变量使下标值为排序组第一个元素(下面代码见如何移动下标值),下面进行判断元素7大于元素4,所以符合条件,元素7跑到元素4的位置,元素4跑到元素7的位置,此时排序组为{4,7},为排序组为{3},这样第一组的第一次排序完成!
-
**注意:**下面将直接到第二组的排序,也就是元素{5,6},同样的元素5为排序组,剩余红色元素为未排序组,把下标为d+1的元素(6)赋给一个临时变量值min,定义一个变量使下标值为排序组第一个元素(下面代码见如何移动下标值),判断元素5和元素6 的值,可知不用交换
-
接下来又转到第一组的排序,此时元素{4,7}为排序组,剩余红色元素为未排序组,把下标为d+2的元素(3)赋给一个临时变量值min,定义一个变量使下标值为排序组第一个元素(下面代码见如何移动下标值),判断元素7和元素3 的值,符合条件可知交换,元素7放到元素3的位置,下面元素3再和元素4进行比较,最后元素3放到元素4的前面
经过第一组第二组的排序,数组变为{
3
,5 ,4
, 6,7
},可见是将两组进行 了各自内部进行了排序,但整体上还没有排序完成,接下来令d=d/2,可得d=1,等于把数组分成了一个组,这就是我们之前学习的插入法排序,最终可得到结果{3,4,5,6,7}。
可见关键是d的值分组,每一次排序都使d的值/2,直到d<0的时候停止排序,即获得想要的结果
下面附上代码
public class xier {
public static void main(String[] args) {
//希尔法升序排序
int []arry= {7,5,4,6,3};
int i,j,d;
d=arry.length/2; //首先求得组数
while(d>0)
{
for(i=d;i<arry.length;i++)
{
int min=arry[i]; //赋给临时值
j=i-d; //使下标移动到排序组的最后一个元素
while(j>=0&&arry[j]>min)
{
arry[j+d]=arry[j];
j=j-d;
}
arry[j+d]=min;
}
d=d/2;
}
for(int z=0;z<arry.length;z++)
{
System.out.print(" "+arry[z]);
}
}
}