"""
希尔排序:也称递减递增排序,它将原始集合分为多个较小的子集合,然后对每个集合
运用插入排序
1. 当增量为3时,表示每相隔两个的元素(索引差3)为一个子序列,将原序列分为了三组子序列
2. 对每个子序列使用插入排序,此时每个子序列就是有序的
3. 逐渐减小增量,重复第二2步
4. 当增量为1时,再执行一次插入排序,此时完整序列就是有序的

希尔排序的复杂度分析稍微复杂一些,但其大致分布在 O(n) 到 O(n^2) 之间。
"""


def shell_sort(nums: list[int]):
    step = len(nums) >> 1
    while step >= 1:
        # 分成了 step 个子序列,循环 step 次,对每个子序列使用插排
        for i in range(step):
            for j in range(i + step, len(nums), step):
                pos = j
                cur = nums[j]
                # 无法对子序列使用二分查找,查找插入位置,因为中间位置无法确定
                while pos >= step and cur < nums[pos - step]:
                    # 将比当前值大的往后移 step 位
                    nums[pos] = nums[pos - step]
                    pos -= step

                nums[pos] = cur
        step >>= 1


nums = [47, 29, 71, 99, 78, 19, 24, 47]
shell_sort(nums)
print(nums)