动画演示:
原理:
希尔排序,其实就是插入排序的一中,主要是将其分为很多组,每组再次进行插入排序
思路:
1、一般来说,首先将数组间距设置为数组长度的1/2,每次将间距再次减半
2、每一组进行插入排序
代码:
public class ShellSort {
public static void main(String[] args) {
int[]arr = new int[]{2,6,3,4,9,8};
sort(arr);
print(arr);
}
private static void sort(int[] arr) {
//初始间距一般为数组的一半
int gap = len / 2;
while(gap > 0){
//gap前面的每一个元素都是每组第一个元素,默认有序
for(int i=gap;i<arr.length;i++){
int cur = arr[i];
//当前插入元素的前一个元素索引
int preIndex = i - gap;
//如果当前需要插入的元素较小,将preIndex位置的值向后移gap位(覆盖)
while(preIndex >= 0 && arr[preIndex] > cur){
arr[preIndex + gap] = arr[preIndex];
//覆盖完成,向前gap位再次比较
preIndex -= gap;
}
//插入的元素大于了preIndex,将元素插入到后面(preIndex + gap)的位置
arr[preIndex + gap] = cur;
}
//间距减半
gap /= 2;
}
}
private static void print(int[] arr) {
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
}
}
算法复杂度:O(nlog2n)
算法空间复杂度:O(1)
算法稳定性:稳定