Shell Sort
时间复杂度O(nlogn)
最好情况O(nlogn**2)
最坏情况O(nlogn**2)
空间复杂度O(1)
In-place
希尔排序
在插入排序的基础上进行了优化,使时间复杂度突破O(n**2)
核心思想是对整个数组进行分组,在分组内进行插排,再次分组再次插排...
直到整个数组为一组,这时候已经基本有序,进行最后一次插排
一般起始我们会把数组分为length/2个组(gap),意味着每个组有两个元素,然后gap = gap/2
直到gap = 1进行最后一次排序。

Java:
public class ShellSort {
    public int[] ClassicalShellSort(int[] a){
        if(a == null||a.length <= 1){
            return a;
        }
        for(int gap = a.length/2;gap > 0;gap = gap/2){
            for (int i = gap; i <a.length; i++) {
                int tem = a[i];
                int preIndex = i - gap;
                // 插入排序:一直后移直到找到合适的位置
                while (preIndex >= 0&&a[preIndex]>tem){
                    a[preIndex + gap] = a[preIndex];
                    preIndex -= gap;
                }
                a[preIndex + gap] = tem;
            }
        }
        return a;
    }
}
 
Python:
def shell_sort(num_list):
    if num_list == None or len(num_list) <= 1:
        return num_list
    gap = len(num_list) // 2
    while gap > 0:
        for i in range(gap, len(num_list)):
            next = num_list[i]
            j = i
            while j > 0:
                if next < num_list[j - 1]:
                    num_list[j] = num_list[j - 1]
                else:
                    break
                j -= 1
            num_list[j] = next
        gap //= 2
    return num_list 










