希尔排序是一种改进的插入排序,又称为缩小增量排序,在时间效率上有了较大的改进,希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。一般的初次取序列的一半为增量,以后每次减半,直到增量为1。也是一种不稳定的排序。给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
第一次 gap = 10 / 2 = 5
49 38 65 97 26 13 27 49 55 4
1A 1B
2A 2B
3A 3B
4A 4B
5A 5B
1A,1B,2A,2B等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素, 每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49) (97, 55) (26, 4)这样每组排序后就变成了(13, 49) (27, 38) (49, 65) (55, 97) (4, 26),下同。
第二次 gap = 5 / 2 = 2
排序后
13 27 49 55 4 49 38 65 97 26
1A 1B 1C 1D 1E
2A 2B 2C 2D 2E
第三次 gap = 2 / 2 = 1
4 26 13 27 38 49 49 55 97 65
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J
第四次 gap = 1 / 2 = 0 排序完成得到数组:
4 13 26 27 38 49 49 55 65 97
算法:
1.外循环以各种不同的间隔距离d进行排序,直到d=1;
2.第二重循环是在某一个d值下对各组进行排序,若在某个d值下发生了记录的交换,则需要继续第三重循环;直至各组内均无记录的交换为止,即各组已经完成排序任务
3.第三重则是从第一个记录开始的,以某个d值为间隔进行组内比较。若有逆序,则进行交换。
public class Slpx {
public static void slpx(int n[]){
int num=n.length;
int d=num/2; //设置增量
int x,y;
while(d>=1){ //以各种不同的距离d来进行排序
for(int i=d;i<num;i++){ //从下标为d开始
x=n[i];
y=i-d;
while(y>=0 && x<n[y]){ //以间隔d来往前搜索比自己小的
n[y+d]=n[y];
y=y-d; //往前面进行比较
}
n[y+d]=x; //进行插入
}
d=d/2; //缩小增量
}
}
public static void main(String[] args) {
int n[]={6,2,4,3,5,4,3};
slpx(n);
for(int i=0;i<n.length;i++){
System.out.print(n[i]);
}
}
}
http://blog.csdn.net/morewindows/article/details/6668714 链接中有着更加详细的介绍,对希尔排序进行了一些优化。