基本思想:
希尔排序属于直接插入排序的改进版,主要思想就是每一遍都与数组自身长度的一半进行比较,比如第一次遍历就是位置为1的元素与位置为1加数组长度一半的位置的元素进行比较,然后第二遍就是与数组长度一半的一半加1进行比较,知道比较的位置变为自己元素的下一个元素为止。先选择一个gap,比如4,使用插入排序现将gap为四的进行排序,比如下标为0,4,8,12,下一步在排1,5,9,13,依次向下排序,这时基本上将数组排序了一遍,
时间复杂度:
空间复杂度:
代码实现:
public class ShellSort {
public int[] Shell(int[] nums){
if (nums.length ==0 ) return nums;
int gap = nums.length/2;
int current;
while (gap>0){
//从数组中间开始循环遍历
for (int i =gap;i<nums.length;i++){
current = nums[i];
//设置前面与数组进行比较的数的下标
int preindex = i-gap;
//当前面的元素大于当前的元素时,进行互换
while (preindex >= 0 && nums[preindex] >current){
nums[preindex+gap] = nums[preindex];
//前面数组的下标等于减去数组长度的一班
preindex -= gap;
}
//否则中间元素赋值给之前的元素的下标加中间的下标之和的位置
nums[preindex+gap] = current;
}
//没循环一次,比较的长度除以2
gap = gap/2;
}
return nums;
}
public static void main(String[] args) {
int[] num = new int[]{9,8,7,6,5,4,3,2,1};
ShellSort s= new ShellSort();
System.out.println(Arrays.toString(s.Shell(num)));
}
}```