版权声明:转载请告知本人 https://blog.csdn.net/qq_41844543/article/details/88824331
希尔排序实现过程及其原理
希尔排序其实就是插入排序的一种升级版,希尔排序将数据按步长(gap)来分组,分别对每一组数据都使用插入排序,接着减小步长继续分组继续排序知道步长为1时就排好续了。
例如:{10, 21 ,56, 31, 14, 78, 13, 12}
此组数据有8个元素,那我假定步长为4 = 8 / 2
- 步长为4时:
{10, 14}, {21, 78}, {56, 13}, {31, 12}
对每组排序后
{10, 14}, {21, 78}, {13, 56}, {12, 31}
得到原数组变为:
{10, 21, 13, 12, 14, 78, 56, 31} - 步长减半为2时:
{10, 13, 14, 56}, {21, 12, 78, 31}
对每组排序后
{10, 13, 14, 56}, {12, 21, 31, 78}
得到原数组变为:
{10, 12, 13, 21, 14, 31, 56, 78} - 步长减半为1时:
{10, 12, 13, 21, 14, 31, 56, 78}
排序后
{10, 12, 13, 14, 21, 56, 78}
按我的理解来说,插入排序是对基本有序的数组效率高,所以希尔排序就巧妙地运用了这个点让插入排序每次都是对基本有序的数组进行排序的从而提高了插入排序的效率改进为了O(n3/2)
代码
python
def shell_sort(arr):
gap = int(len(arr)/2)
# gap为步长while确定步长大小
while gap >= 1:
# 确定需要排列的组数
for i in range(gap):
# 插入排序 注意此时的步长为gap
for j in range(i, len(arr), gap):
preIndex = j - gap
current = arr[j]
while preIndex >= i and current <= arr[preIndex]:
arr[preIndex + gap] = arr[preIndex]
preIndex -= gap
arr[preIndex + gap] = current
gap = int(gap/2)
return arr
arr = []
for i in range(10):
num = float(input("please enter a number:"))
arr.append(num)
shell_sort(arr)
print(arr)
输入与输出
please enter a number:15
please enter a number:21
please enter a number:14
please enter a number:26
please enter a number:84
please enter a number:13
please enter a number:54
please enter a number:33
please enter a number:34
please enter a number:53
[13.0, 14.0, 15.0, 21.0, 26.0, 33.0, 34.0, 53.0, 54.0, 84.0]