vlambda博客
学习文章列表

5分钟学会经典排序算法-希尔排序

点击蓝色“ 不太灵光的程序员”关注我哟

加个“星标”,每天上午 09:30,干货推送!

希尔排序

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。

  • 时间复杂度O(N*logN)

  • 空间复杂度O(1)

  • 不稳定排序:比如一个待排序数组5115,当我们选择步长为2开始排序,第一位置上的5和第二个位置上的1交换,得到1155,2个1的顺序变换了,破坏了数据的稳定性。

算法原理

  • 首先将要排序数组数按步长d分成若干份,每组中记录的下标相差d,对每组进行插入排序;

  • 然后再减小d的取值,再次分组,重复以上过程;

  • 直至分成若干组最终以长为1的插入排序结束;

  • 整个数组的排序完成。

希尔排序是改的插入排序对插入步长进行了调整,插入排序步长为1,希尔排序的步长是从大到小调整的。

希尔排序算法中即体现了插入排序在有序度高的序列中排序的高效性又综合了分治法缩小插入排序的数据规模的优势。

希尔排序中的关键是各次迭代所引用的步长,步长增长影响扫描次数,而扫描次数影响逻辑组内元素规模,逻辑组规模及逻辑组有序度影响插入操作次数,因而步长的选择对希尔排序的时间复杂度起决定性影响。

Python实现

示例代码首次选取数据集长度的一半为 步长,以后每次减半,直到步长为1。
def shell_sort(arr):

def inster_sort(arr, gap): # 插入排序
for i in range(gap, len(arr)):
index = i
data = arr[i]
while index > gap and arr[index - 1] > data:
# 移动基础 列表,确定要插入的位置
arr[index] = arr[index - 1]
index -= 1
arr[index] = data
return arr

# def inster_sort(arr, gap):    # 插入排
# for i in range(gap, len(arr)):
# index = i
# data = arr[i]
# while index >= gap and arr[index - gap] > data:
# # 移动基础 列表,确定要插入的位置
# arr[index] = arr[index - gap]
# index -= gap
# arr[index] = data
# return arr

gap = len(arr)

while gap > 0:
gap = gap // 2
inster_sort(arr, gap)
return arr


if __name__ == "__main__":
print(shell_sort([45, 32, 8, 33, 12, 22, 19, 97]))

end



推荐阅读:

如有收获,点个在看,诚挚感谢