希尔排序是插入排序的一种,是直接插入排序算法的一种更高效的改进版本。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2
package problem;
import java.util.Arrays;
/*
* 希尔排序:采用分组的策略,组内进行排序
* 时间复杂度O(n^1.3~1.5),不稳定
* 尽量让数据变得有序
* 越有序越快
* */
public class Shellsort {
public static void shell(int[] array,int gap){//排序
int tmp = 0;
int j;
for(int i = gap;i<array.length;i++){
tmp = array[i];
for(j=i-gap;j>=0;j-=gap){
if(array[j] > tmp){
array[j+gap] = array[j];
}else{
break;
}
}
array[j+gap] = tmp;
}
}
public static void shellsort(int[] array){
int[] d = {5,3,1};//分组个数,最后一个必须为1,并且所有为素数,
for(int i = 0;i<d.length;i++){
shell(array,d[i]);
}
}
public static void main(String[] args) {
int[] array ={12,42,1,13,2,65,77,18,17,32};
shellsort(array);
System.out.println(Arrays.toString(array));
}
}
运行结果:
第一次排序:
第二次排序:
第三次排序: