希尔排序是直接插入排序的升级版,比直接插入排序更高效。通过增量限制步长,将数组分组,对每组使用插入排序。逐渐减少增量,每组包含的数据越来越多,当增量减至1时,步长为1,变成已经大致排序好了的直接插入排序完成排序算法。
时间复杂度:最好情况为O(n),平均为O(logn),最坏情况也小于O(n^2)
代码如下:
/**
* 希尔(shell)排序
*/
public class ShellSort {
public static void main(String[] args) {
int[] nums = new int[10];
Random random = new Random();
for (int i = 0; i < 10; i++) {
nums[i] = random.nextInt(100);
}
System.out.println(Arrays.toString(nums));
System.out.println("------------");
shellSort(nums); //调用方法
System.out.println(Arrays.toString(nums));
}
private static void shellSort(int[] nums) {
int d = nums.length;
while (d > 0) {
d = d / 2; //d = d/3+1也是一直增量计算方式
for (int x = 0; x < d; x++) { //分的组数
for (int i = x + d; i < nums.length; i += d) { //组中的元素,从第二个数开始
int j = i - d; // i为该组最后一位数,j现在为倒数第二位
int temp = nums[i]; //取到要插入的元素
//从后往前遍历
for (; j >= 0 ; j -= d) {
if( temp < nums[j]){
nums[j + d] = nums[j]; //向后移动d位
}else break; //temp >= num[j]的时候,跳出循环 ,不写这句也行但是会多对比几次
}
nums[j + d] = temp;
}
}
}
}
}
都看到这了,点个赞不过分吧