希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
希尔排序之前一直没有搞懂,这几天闲来搞搞算法,这次终于看懂了。
如果一个数组a[],长度为l,算法步骤如下:1、 d=l/2,然后a[i]跟a[i+d]一组做简单插入排序;2、d=d/2,然后a[i],a[i+d],a[i+2d],...做简单插入排序,3、直到d=1,完成在做一次简单插入排序,即完成排序。(妈蛋,貌似没说清楚,表述能力实在有限,上代码)
/**
* 希尔排序,直接插入排序的优化
* @param src
*/
public static void shellSort1(int src[]){
if(src==null||src.length<2){
return;
}
int srcLen=src.length;
int g=srcLen/2;
while(g>0){
for(int i=0;i<g;i++){
for(int j=i+g;j<srcLen;j+=g){
int temp=src[j];
int pos=j;
for(int k=j-g;k>=i;k-=g){
if(temp<src[k]){
src[k+g]=src[k];
pos=k;
}else {
break;
}
}
src[pos]=temp;
}
}
g=g/2;
}
}
10万随机数据测试结果:
开始排序...
排序时间是18毫秒
0,11,25,28,30,32,61,77,79,93,94,100,156,172,174,215,216,218,221,222,……,999956,999993,999997
对比直接插入排序,速度快了很多很多。