# 回顾插入排序
| def insertSort(li): |
| for i in range(1,len(li)): |
| tmp=li[i] |
| j=i-1 |
| while j>=0 and li[j]>tmp: |
| li[j+1]=li[j] |
| j-=1 |
| li[j+1]=tmp |
# 希尔排序
现在,希尔排序在插入排序的基础上,设置了间隔 gap
,实现了分组插入排序
- 首先取一个整数
d1=n/2
,将元素分为 d1
个组,每组相邻两元素之间间距为 d1
,在个组内进行直接插入排序 - 取第二个整数
d2=d1/2
,重复上述分组排序过程,直到 di=1
,即所有元素在同一组内进行直接插入排序
希尔排序每趟并不能使某些元素有序,而是使整体数据越来越接近有序;最有一趟使得所有数据有序。
| def insertSort_gap(li,gap): |
| for i in range(gap,len(li)): |
| tmp=li[i] |
| j=i-gap |
| while j>=0 and li[j]>tmp: |
| li[j+gap]=li[j] |
| j-=gap |
| li[j+gap]=tmp |
| |
| def shell_sort(li): |
| d=len(li)//2 |
| while d>=1: |
| insertSort_gap(li,d) |
| d//=2 |
| |
| |
| import random |
| li=list(range(10)) |
| random.shuffle(li) |
| print(li) |
| shell_sort(li) |
| print(li) |
| [1, 9, 8, 5, 2, 0, 4, 6, 7, 3] |
| [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |