0
点赞
收藏
分享

微信扫一扫

排序算法-希尔排序

陈情雅雅 2022-04-23 阅读 100

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

 

举报

相关推荐

0 条评论