一、希尔排序简介

希尔排序(Shell's Sort),也被称为递减增量排序算法(Diminishing Increment Sort),是插入排序的一种更高效的改进排序算法。

在希尔排序算法中,我们将数组 h 排序为较大的 h 值。我们不断减小 h 的值,直到它变为 1。如果对每个 h\'th 元素的所有子列表进行排序,则称数组为 h 排序。

二、实现希尔排序的Python代码

希尔排序是对插入排序算法的优化。希尔排序最初以较大的间隔对元素进行排序,逐渐减小间隔大小。该代码定义了将数组 arr 作为输入的 shellSort 函数。它将间隙大小初始化为数组长度的一半。该算法在每个区间内执行修改后的插入排序,逐渐减小间隙。元素被比较并移动到正确的位置。驱动程序代码初始化数组,应用 shellSort 函数,并打印原始数组和排序数组。该算法的时间复杂度取决于所选的间隙序列,与插入排序相比,性能更高。

# 希尔排序 for python

def shellSort(arr):

	# 从一个大的间隙开始,然后缩小间隙
	n = len(arr)
	gap = n/2

  #对此间隙大小执行间隙插入排序。
  #第一间隙元件a[0..gap-1]已经处于间隙中
  #继续添加一个元素,直到整个数组
  #间隙已排序
	while gap > 0:

		for i in range(gap,n):

			# 将a[i]添加到已进行间隙排序的元素中
			# 保存 a[i] in temp ,在位置i处,make a hole
			temp = arr[i]

			# shift earlier gap-sorted elements up until the correct
			# location for a[i] is found
			j = i
			while j >= gap and arr[j-gap] >temp:
				arr[j] = arr[j-gap]
				j -= gap

			# put temp (the original a[i]) in its correct location
			arr[j] = temp
		gap /= 2


# 驱动代码测试
arr = [ 12, 34, 54, 2, 3]

n = len(arr)
print ("Array before sorting:")
for i in range(n):
	print(arr[i]),

shellSort(arr)

print ("\nArray after sorting:")
for i in range(n):
	print(arr[i]),

输出

Array before sorting:
12 34 54 2 3 
Array after sorting:
2 3 12 34 54

时间复杂度:O(n2)

辅助空间:O(1)