希尔排序是对插入排序的优化,优化思想:
插入排序在移动元素的时候是最浪费时间的,而如果有一种方法,让待排序的数组基本有序,然后再使用插入排序,性能就会提高一些。
此时,希尔排序就出现了。他的方法是逐步减小步长,例如,待排序的数组长度是10,那么步长依次取 10/2=5, 5/2=2, 2/2=1 (注:希尔排序的最后一次步长必须为1),下面发代码:
import java.util.Arrays;
/**
* 插入排序的优化,减小步长
* 希尔排序不稳定
*
*/
public class ShellSort {
//49, 38, 65, 97, 26, 13, 27,49, 55, 4
public static void main(String[] args) {
int arry[]={49,38,65,97,26,13,27,49,55,4};
shellSort(arry,arry.length);
}
/**
*
* @param arry 带排序数组
* @param len 数组长度
*/
private static void shellSort(int[] arry,int len){
long time=System.currentTimeMillis();
int i,j,gap; //gap表示步长,第一趟排序gap=5,第二趟gap=2,第三趟gap=1;
for(gap=len/2;gap>0;gap/=2){ //
for(i=0;i<gap;i++){
for(j=i+gap;j<len;j+=gap){
int temp=arry[j];
int k=j-gap;
while(k>=0&&temp<=arry[k]){
arry[k+gap]=arry[k];
k-=gap;
}
arry[k+gap]=temp;
}
}
}
System.out.println(Arrays.toString(arry));
}
}
import java.util.Arrays;
/**
* 上述希尔排序的优化,减少一层循环
* 优化原理:
* 例:对数据 49, 38, 65, 97, 26, 13, 27,49, 55, 4 , gap=2 时
* 是先对 49,65,26,27,55排序 ,再对 38,97,13,49,5 排序
* 其实也可以把他们拆分来排序,即 先对49 65排序,然后对38,97排序,依次类推
*
*/
public class ShellSort02 {
//49, 38, 65, 97, 26, 13, 27,49, 55, 4
public static void main(String[] args) {
int arry[]={49,38,65,97,26,13,27,49,55,4};
shellSort(arry,arry.length);
}
private static void shellSort(int[] arry,int len){
int j,gap;
for(gap=len/2;gap>0;gap/=2){
for(j=gap;j<len;j++){
int temp=arry[j];
int k=j-gap;
while(k>=0&&temp<=arry[k]){
arry[k+gap]=arry[k];
k-=gap;
}
arry[k+gap]=temp;
}
}
System.out.println(Arrays.toString(arry));
}
}